2016-07-25 40 views
1

我有一堆矢量需要將一個矢量相加到另一個。我正在尋找更加優雅的向量添加解決方案,而不是使用'+'運算符。是否有人知道以更舒適的方式做到這一點的任何訣竅。由於如何更精美地使用矢量和而不是使用'+'運算符

矢量:

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) 

我知道這樣做的虛擬方式,我期待着什麼高雅這樣做

所需的輸出:

out <- c(1,2,2,2,2,3,2,2,2) 

這樣做的任何優雅的方式更有效的操作類型?

+2

也許'colSums(rbind(a,b,c))'? – zx8754

+0

你需要添加多少個載體,也許我的解決方案可能不是最好的。如在中,我們不希望將所有向量輸入到'rbind(a,b,c,... z)'中...... – zx8754

+4

可能'Reduce(「+」,list(a,b,c))' ? (仍然使用+運算符...) –

回答

10

我們可以把所有的載體一起使用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  
+4

顯然也'rowSums(cbind(a,b,c))' –

4

從S4Vectors使用縮小:

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

這個解決方案可以適合至今添加了非常大的維矢量,快速高效的情況。