1) %+% 定义自定义 + 运算符:
`%+%` <- function(x, y) mapply(sum, x, y, MoreArgs = list(na.rm = TRUE))
5 + 2 * (x %+% y - 50) / (x %+% y %+% z %+% a)
提供:
[1] 3.303030 3.555556 3.769231 4.388889 4.473684 4.550000 4.619048 4.681818
[9] 4.739130 3.787879
以下是一些简单的示例:
1 %+% 2
NA %+% 2
2 %+% NA
NA %+% NA
2) na2zero 另一个可能性是定义一个将NA映射到0的函数,如下所示:
na2zero <- function(x) ifelse(is.na(x), 0, x)
X <- na2zero(x)
Y <- na2zero(y)
Z <- na2zero(z)
A <- na2zero(a)
5 + 2 * (X + Y - 50) / (X + Y + Z + A)
提供:
[1] 3.303030 3.555556 3.769231 4.388889 4.473684 4.550000 4.619048 4.681818
[9] 4.739130 3.787879
3) 合并以上内容 将(1)与(2)中的想法相结合的一种变化形式是:
X <- x %+% 0
Y <- y %+% 0
Z <- z %+% 0
A <- a %+% 0
5 + 2 * (X + Y - 50) / (X + Y + Z + A)
4) numeric0类 我们可以定义一个自定义类"numeric0"
,带有自己的+运算符:
as.numeric0 <- function(x) structure(x, class = "numeric0")
`+.numeric0` <- `%+%`
X <- as.numeric0(x)
Y <- as.numeric0(y)
Z <- as.numeric0(z)
A <- as.numeric0(a)
5 + 2 * (X + Y - 50) / (X + Y + Z + A)
注意: 所使用的输入是问题中提供的,即:
x = 1:10
y = c(21:29,NA)
z = 11:20
a = c(NA,NA,NA,30:36)
rowSums(cbind(x,y), na.rm = T)
- M--apply(cbind(x,y), 1, function(x) sum(x, na.rm = T))
- M. Beausoleilcbind
创建的是矩阵,而不是数据框。rowSums
已经被优化过了,因此比apply(..., 1, sum, na.rm = T)
快得多。 - Gregor Thomas+
。你可以简单地在最终结果向量中跳过NA值,例如res<-res[!is.na(res)]
,这也避免了在不同数量的NA值的情况下对不同长度的向量求和的风险。如果你想用零来替换NA值,那就是另一回事了... - digEmAll