R 如何更优雅地进行向量求和,而不是使用'+';操作人员

R 如何更优雅地进行向量求和,而不是使用'+';操作人员,r,vector,R,Vector,我有一堆向量,需要把一个向量和另一个向量求和。我正在寻找更优雅的矢量加法解决方案,而不是使用“+”运算符。有人知道用更舒适的方式做这件事的诀窍吗。谢谢 向量: a <- c(1,1,0,2,1,0,1,0,1) b <- c(0,0,1,0,1,1,0,1,0) c <- c(0,1,1,0,0,2,1,1,1) a我们可以使用rbind将所有向量放在一起,然后使用colSums: colSums(rbind(a, b, c)) # [1] 1 2 2 2 2 3 2 2 2

我有一堆向量,需要把一个向量和另一个向量求和。我正在寻找更优雅的矢量加法解决方案,而不是使用“+”运算符。有人知道用更舒适的方式做这件事的诀窍吗。谢谢

向量:

a <- c(1,1,0,2,1,0,1,0,1)
b <- c(0,0,1,0,1,1,0,1,0)
c <- c(0,1,1,0,0,2,1,1,1)

a我们可以使用rbind将所有向量放在一起,然后使用colSums:

colSums(rbind(a, b, c))
# [1] 1 2 2 2 2 3 2 2 2
基准:

# bigger input
set.seed(1)
n <- 10^7
a <- runif(n)
b <- runif(n)
c <- runif(n)
d <- runif(n)
e <- runif(n)
f <- runif(n)

# benchmark
microbenchmark::microbenchmark(
  colSums = colSums(rbind(a, b, c, d, e, f)),
  rowSums = rowSums(cbind(a, b, c, d, e, f)),
  Reduce = base::Reduce("+", list(a, b, c, d, e, f)),
  S4vReduce = S4Vectors::Reduce('+', lapply(list(a, b, c, d, e, f), lengths)),
  JustAdd = a + b + c + d + e + f
)


# Unit: milliseconds
#       expr       min        lq      mean    median       uq      max neval   cld
#    colSums 408.31052 427.94015 470.27181 461.18763 494.1420 651.3383   100     e
#    rowSums 349.93752 359.15854 408.82652 397.99315 434.1662 569.3575   100    d 
#     Reduce 129.43443 134.55584 183.34432 179.88746 208.0281 339.9345   100  b   
#  S4vReduce 162.90015 166.19150 206.16387 192.73739 212.2146 380.2038   100   c  
#    JustAdd  73.38243  74.00267  92.68309  76.12524  82.7517 282.6101   100 a    
#更大的输入
种子(1)

n使用来自S4Vectors的Reduce:

vec.li <- list(a,b,c)
vec.sum <- S4Vectors::Reduce('+', lapply(vec.li, lengths))

vec.li可能
colSums(rbind(a,b,c))
你需要加多少个向量,也许我的解决方案不是最好的。如中所述,我们不希望将所有向量键入
rbind(a,b,c,….z)
…可能
Reduce(“+”,list(a,b,c))
?(仍在使用+运算符…@zx8754:如果我有非常大的向量,比如每个向量都有数百万长,那么使用“+”运算符是不可取的。我认为你的解决方案很好。基于您的启发,我提出了另一个解决方案。“我提出了另一个解决方案”-请分享作为答案,您可以发布您自己问题的答案,或建议编辑我的帖子。显然,还有
rowSums(cbind(a,b,c))
vec.li <- list(a,b,c)
vec.sum <- S4Vectors::Reduce('+', lapply(vec.li, lengths))