R中向量元素的求和

时间:2015-08-11 19:27:54

标签: r sum

我正在寻找一种更好的方法来按元素对矢量求和。 假设我们有3个向量:

a <- c(1, 2, 3, 4)
b <- c(5, 6, 7, 8)
c <- c(9, 10, 11, 12)

我想要

d = c(15, 18, 21, 24)

我一直在努力的方式是通过for循环,但我认为这有点单调乏味,并且对于大型向量可能会很慢,即:

for (j in 1:4){
   d[j] = sum(c(a[j], b[j], c[j]))
}

R中是否有一个函数只是按元素位置将这些向量加在一起?

3 个答案:

答案 0 :(得分:4)

试试这个

a+b+c

矢量化数学!欢呼声

答案 1 :(得分:3)

在我们colSums向量'a','b'和'c'之后我们可以使用rbind

 colSums(rbind(a,b,c))
 #[1] 15 18 21 24

或者我们可以将其放在list中并使用Reduce/+

Reduce(`+`, list(a,b,c))
#[1] 15 18 21 24

我使用colSums作为+在有NA元素时有一些限制。例如。

 a1 <- c(3, 2, NA, 1)
 b1 <- c(5, NA, 3, 2)
 a1+b1
 #[1]  8 NA NA  3

na.rm中的colSums参数可用于此类条件。

 colSums(rbind(a1,b1), na.rm=TRUE)
 #[1] 8 2 3 3

即使Reduce方法也不好。

答案 2 :(得分:2)

@nongkrong是正确的,a+b+c是最简单的方法。

@akrun也有关于NA的有效点。

但我想指出 1)其他功能类似的功能, 2)功能是更常见的对应物的矢量化版本, 3 )可以帮助您在任何情况下执行此任务的功能。

  1. 同样的习语适用于a*b*c

    a*b*c
    [1]  45 120 231 384
    
  2. 对于minmax,可以使用不同的功能:pmin和 分别为pmax

    pmin(a,b,c)
    [1] 1 2 3 4
    
  3. 如果要将一个函数元素应用于一系列向量, 试试mapply

    mapply(sum, a, b, c) # this answers your question!
    [1] 15 18 21 24
    

    注意,在将+mapply(即mapply("+", a, b))结合使用时,您只能使用2个向量b / c +需要2个值(而a+b+c一次处理3个值,但调用+两次!)。

  4. 另请注意,pminsummapply内)可以通过na.rm=TRUE广告轻松处理NA(例如,mapply(sum, a, b, c, na.rm=TRUE)

    祝你好运,并欢迎R中的矢量化和其他漂亮技巧:)