R 基于另一个向量的值添加矩阵的列

R 基于另一个向量的值添加矩阵的列,r,matrix,collapse,R,Matrix,Collapse,假设我有以下矩阵: mat <- matrix(1:20, ncol=5) [,1] [,2] [,3] [,4] [,5] [1,] 1 5 9 13 17 [2,] 2 6 10 14 18 [3,] 3 7 11 15 19 [4,] 4 8 12 16 20 我需要通过根据向量计数的每个值添加列来折叠这个矩阵。这意味着前两列必须相加,第三列保持相等,最后两列求和。我得到

假设我有以下矩阵:

 mat <- matrix(1:20, ncol=5)
      [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20
我需要通过根据向量计数的每个值添加列来折叠这个矩阵。这意味着前两列必须相加,第三列保持相等,最后两列求和。我得到的矩阵一定是这样的

      [,1] [,2] [,3] 
[1,]    6    9   30
[2,]    8   10   32
[3,]    10  11   34
[4,]    12  12   36

如果我有一个非常大的矩阵,并且有一个不同值的计数向量,我怎么能自动做到这一点呢?

一种方法是通过“计数”向量复制“计数”序列,使用它来
拆分
列序列的“mat”,以返回一个
列表,使用
sapply
循环遍历
列表
,使用列索引来
子集
每个
列表
元素的“mat”,并获取
行和

mat2 <- sapply(split(1:ncol(mat), rep(seq_along(counts), counts)), 
           function(i) rowSums(mat[,i,drop=FALSE]))
dimnames(mat2) <- NULL
mat2
#     [,1] [,2] [,3]
#[1,]    6    9   30
#[2,]    8   10   32
#[3,]   10   11   34
#[4,]   12   12   36

mat2另一个理念,在概念上与akrun相似:

t(rowsum(t(mat), rep(seq_along(counts), counts)))
#      1  2  3
#[1,]  6  9 30
#[2,]  8 10 32
#[3,] 10 11 34
#[4,] 12 12 36
t(rowsum(t(mat), rep(seq_along(counts), counts)))
#      1  2  3
#[1,]  6  9 30
#[2,]  8 10 32
#[3,] 10 11 34
#[4,] 12 12 36