【发布时间】:2017-12-31 20:43:27
【问题描述】:
我想在 R 中计算一个方程。我不想使用函数 sum,因为它返回 1 个值。我想要完整的值向量。
x = 1:10
y = c(21:29,NA)
x+y
[1] 22 24 26 28 30 32 34 36 38 NA
x = 1:10
y = c(21:30)
x+y
[1] 22 24 26 28 30 32 34 36 38 40
我不想要:
sum(x,y, na.rm = TRUE)
[1] 280
不返回向量。
这是一个玩具示例,但我有一个更复杂的方程,它使用长度为 84647 个元素的多个向量。
这是我的意思的另一个例子:
x = 1:10
y = c(21:29,NA)
z = 11:20
a = c(NA,NA,NA,30:36)
5 +2*(x+y-50)/(x+y+z+a)
[1] NA NA NA 4.388889 4.473684 4.550000 4.619048 4.681818 4.739130 NA
【问题讨论】:
-
获取连接向量的行和。
rowSums(cbind(x,y), na.rm = T) -
好的,所以你可以把它放在数据框格式中。不能直接将它们用作向量吗?
apply(cbind(x,y), 1, function(x) sum(x, na.rm = T)) -
cbind创建矩阵,而不是数据框。rowSums已经过优化,会非常快,比apply(..., 1, sum, na.rm = T)更快。 -
跳过 复杂表达式中的 NA 不需要使用自定义的
+。您可以简单地跳过最终结果向量中的 NA,例如res<-res[!is.na(res)],这也避免了最终对不同长度的向量求和的风险(在不同数量的 NA 的情况下)。如果您想用零替换 NA,那就是另一回事了...