根据另一个向量的值添加矩阵的列

Add columns of a matrix based on values of another vector

假设我有以下矩阵:

 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

和下面的向量

counts=c(2,1,2)

我需要通过添加基于该向量计数的每个值的列来折叠该矩阵。这意味着前两列最多被添加,第三列保持相等并对最后两列求和。我的结果矩阵必须是这样的

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

考虑到在我的例子中我有一个非常大的矩阵和一个具有不同值的计数向量,我怎么能以自动方式执行此操作?

一种方法是通过 'counts' 向量复制 'counts' 的序列,将其用于 split 'mat' 到 return 的列序列list,使用 sapply 遍历 list,对每个 list 元素使用列索引 subset 'mat' 并获取 rowSums.

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

另一个想法,在概念上类似于 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