1

我需要应用一个滚动函数来对每两列的行求和,因此第 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)   

谢谢!

4

3 回答 3

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
于 2015-07-14T15:45:15.220 回答
0

您可以使用矩阵乘法:

> 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
于 2015-07-15T16:59:56.087 回答
0

另一种方法是转换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
于 2015-07-15T17:09:08.220 回答