有没有一个R函数叫做“parallel sum”?

5

我希望对包含NA的向量进行求和。

例如:

a <- c(5, 3, 1, NA, 2)
b <- c(NA, 1, 2, 1, 7)

预期输出应为:
[1] 5 4 3 1 9

sum在这种情况下不起作用,因为sum(a,b,na.rm=T)等同于sum(c(a,b),na.rm=T)

+可以工作(即a+b),但不能删除NA

您可以使用rowSums(cbind(a,b),na.rm = T),但在实践中,这可能会导致混乱的代码-例如,如果向量是data.table的列。

是否有与pmax相当的总和函数,例如psum(a,b,na.rm=T)


给定输入 ab,你期望的输出是什么? - Martin Gal
2
只需复制a和b,并在副本中将NA设置为零。 - G5W
谢谢 - 我已经编辑了问题以显示预期输出。 - Dan Lewer
1
如果向量是数据表的列,并且您想执行此操作,则可能使用了错误的数据结构,或者可能应该重新整理该数据表... - Roland
3个回答

3
您可以尝试使用mapply将sum函数应用于向量a和b。 na.rm=TRUE指示从计算中删除NA值:
a <- c(5, 3, 1, NA, 2)
b <- c(NA, 1, 2, 1, 7)

mapply(sum, a, b, na.rm=TRUE)

输出:

[1] 5 4 3 1 9

或者,你可以选择使用 @Roland 建议的 reduce

Reduce("+", lapply(list(a,b), function(x) replace(x, is.na(x), 0)))

1
对于较长的向量,循环遍历向量元素将非常低效。编写一个版本的 +,首先将 NA 值转换为零,然后使用 Reduce 循环遍历向量,速度会更快。 - Roland
嗨@Roland。谢谢你提供的信息。我已添加了一个选项来使用Reduce。另外,如果你想学习更多关于Reduce的知识,@DanLewer可以看看R:Reduce() - apply的不太出名的兄弟 - iamericfletcher

1
"

mapply是你想要的:

"
mapply(sum, a, b, na.rm = TRUE)

# [1] 5 4 3 1 9

1

你可以自己制作 psum 函数。

psum <- function(x,y){
x[is.na(x)] <- 0
y[is.na(y)] <- 0
x+y
}


> psum(a,b)
[1] 5 4 3 1 9

1
我本来也想建议类似的事情,但是这个函数是错的:它的名称表明它执行与pmax相当的操作,但实际上不是。它有独特的、不可概括的语义。如果要称为psum,它应该允许超过两个参数,并且还应该公开一个具有适当语义的na.rm参数。 - Konrad Rudolph
1
@KonradRudolph 使用Reduce很容易泛化。 - Roland
@Roland,那是真的,但那甚至不是我所指的(请参见更新的评论)。 - Konrad Rudolph
@KonradRudolph 没问题。只需编写一个包装器,使用 if 条件来使用此函数或使用 Reduce+ - Roland
2
@KonradRudolph 也许我函数中的“p”并不代表“parallel”,而是代表“personal”。也就是说,这是我的个人函数,我可以随意命名。 - Daniel O
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接