【问题标题】:Summation by elements of vectors in RR中向量元素的总和
【发布时间】:2015-08-12 06:13:59
【问题描述】:

我正在寻找一种更好的方法来按元素对向量求和。 假设我们有 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 中是否有一个函数可以将这些向量按元素位置相加?

【问题讨论】:

    标签: r sum


    【解决方案1】:

    我们可以在rbind 向量“a”、“b”和“c”之后使用colSums

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

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

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

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

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

    colSums 中的na.rm 参数对这种情况很有用。

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

    即使Reduce 方法也不好。

    【讨论】:

      【解决方案2】:

      试试这个

      a+b+c
      

      矢量化数学!干杯

      【讨论】:

        【解决方案3】:

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

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

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

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

          a*b*c
          [1]  45 120 231 384
          
        2. 对于minmax,可以使用不同的函数:pminpmax

          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 个值一次但调用+ 两次!)。

        还要注意pminsum(在mapply 内)可以通过na.rm=TRUE 参数轻松处理NA(例如mapply(sum, a, b, c, na.rm=TRUE)

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-18
          • 2017-11-22
          • 2015-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-15
          相关资源
          最近更新 更多