我的第一直觉是建议使用sum()
从那时起你可以使用na.rm
争论。然而,这不起作用,因为sum()
将其参数减少为单个标量值,而不是向量。
这意味着你需要写一个parallel sum
功能。我们称之为psum()
,类似于基本 R 函数pmin()
or pmax()
:
psum <- function(..., na.rm=FALSE) {
x <- list(...)
rowSums(matrix(unlist(x), ncol=length(x)), na.rm=na.rm)
}
现在设置一些数据并使用psum()
得到所需的向量:
dat <- data.frame(
x = c(1,2,3, NA),
y = c(NA, 4, 5, NA))
transform(dat, new=psum(x, y, na.rm=TRUE))
x y new
1 1 NA 1
2 2 4 6
3 3 5 8
4 NA NA 0
同样,您可以定义一个parallel product
, or pprod()
像这样:
pprod <- function(..., na.rm=FALSE) {
x <- list(...)
m <- matrix(unlist(x), ncol=length(x))
apply(m, 1, prod, na.rm=TRUE)
}
transform(dat, new=pprod(x, y, na.rm=TRUE))
x y new
1 1 NA 1
2 2 4 8
3 3 5 15
4 NA NA 1
这个例子pprod
为您想要执行的操作提供了一个通用模板:创建一个使用apply()
将输入矩阵总结为所需向量。