【问题标题】:Summing rows of rolling columns汇总滚动列的行
【发布时间】:2015-07-16 01:09:08
【问题描述】:

我需要应用一个滚动函数,对每两列的行求和,因此第 1&2 列的行将被求和,3&4 等。

m<-matrix(c(1,2,3,4,5,3,4,5,6,2,4,6,6,7,3,2,4,4,5,7),nrow=2,byrow=T)

我查看了许多函数,包括 apply、rollapply、aggregate 等,但似乎找不到一个对指定列的行进行滚动求和的函数。

我完全有能力编写很长的代码,但我正在寻找一个最有可能涉及函数的有效解决方案。

sum1<-(m[,1]+m[,2])
sum2<-(m[,3]+m[,4])
sum3<-(m[,5]+m[,6])
sum4<-(m[,7]+m[,8])
sum5<-(m[,9]+m[,10])

cbind(sum1,sum2,sum3,sum4,sum5)   

谢谢!

【问题讨论】:

  • zoo::rollapply(t(m), 2, sum, by = 2)
  • 谢谢@Khashaa,应该是t(rollapply(t(m), 2, sum, by = 2))

标签: r apply rowsum


【解决方案1】:

您可以使用这种方法:

m[,seq(1, ncol(m),2)] + m[,seq(2, ncol(m), 2)]
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    3    7    8    9    8
#[2,]   10   13    5    8   12

【讨论】:

    【解决方案2】:

    您可以使用矩阵乘法:

    > n <- ncol(m)/2
    > S <- diag(n)[rep(1:n, each=2),]
    > S
          [,1] [,2] [,3] [,4] [,5]
     [1,]    1    0    0    0    0
     [2,]    1    0    0    0    0
     [3,]    0    1    0    0    0
     [4,]    0    1    0    0    0
     [5,]    0    0    1    0    0
     [6,]    0    0    1    0    0
     [7,]    0    0    0    1    0
     [8,]    0    0    0    1    0
     [9,]    0    0    0    0    1
    [10,]    0    0    0    0    1
    > m %*% S
         [,1] [,2] [,3] [,4] [,5]
    [1,]    3    7    8    9    8
    [2,]   10   13    5    8   12
    

    【讨论】:

      【解决方案3】:

      另一种方法是将m 转换为 3 维数组,然后对列求和:

      > X <- m
      > dim(X) <- c(2,2,5)
      > colSums(aperm(X, c(2,1,3)))
           [,1] [,2] [,3] [,4] [,5]
      [1,]    3    7    8    9    8
      [2,]   10   13    5    8   12
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-19
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 1970-01-01
        • 2020-11-17
        相关资源
        最近更新 更多