【发布时间】:2011-01-28 05:45:57
【问题描述】:
我有一个问题,我必须从 R 中的数据集中添加 33 个等长的整数向量。我知道简单的解决方案是
Vector1 + Vector2 + Vector3 +VectorN
但我确信有办法对此进行编码。还有一些向量用 NA 代替整数,所以我需要一种方法来跳过它们。我知道这可能是非常基本的,但我是新手。
【问题讨论】:
-
我推荐使用
r标签而不是rstats
我有一个问题,我必须从 R 中的数据集中添加 33 个等长的整数向量。我知道简单的解决方案是
Vector1 + Vector2 + Vector3 +VectorN
但我确信有办法对此进行编码。还有一些向量用 NA 代替整数,所以我需要一种方法来跳过它们。我知道这可能是非常基本的,但我是新手。
【问题讨论】:
r标签而不是rstats
这是另一种方法,在对向量求和时删除 NA:
df <- data.frame(vector1, vector2, vector3, vector4)
rowSums(df, na.rm=T)
【讨论】:
apply(df, 1, sum, na.rm=TRUE)
实际上,这并不像看起来那么容易。我认为您想摆脱 NA 并用 0(零)替换它们。另一个解决方案是:
# create dummy variables
set.seed(1234)
x <- round(rnorm(10, 15, 3.2))
y <- round(runif(10, 12, 27))
z <- round(rpois(n = 10, lambda = 5))
# create some NA's
x[c(2,3)] <- NA
y[c(1,3,7)] <- NA
z[c(3,6,10)] <- NA
现在,如果你这样做:
x + y + z # the result is:
[1] NA NA NA 20 31 41 NA 39 37 25
所以运行:
x[is.na(x)] <- 0
y[is.na(y)] <- 0
z[is.na(z)] <- 0
因此:
x + y + z # yields:
[1] 16 21 0 25 34 41 16 42 48 25
但是,坦率地说,我建议您坚持使用 @xiechao 的解决方案! 这非常简单明了!
【讨论】:
do.call("+", list(vector1, vector2, vector3, vector4))
【讨论】:
这就是 mapply 的用武之地:
mapply(sum,Vector1,Vector2,Vector3,VectorN,na.rm = TRUE)
简单智能清晰
【讨论】:
add = function(...) {
vectors = list(...)
res=vectors[[1]]
for(i in vectors[-1]) res = res + i
return(res)
}
add(1:3,4:5,1:3)
【讨论】: