2015-11-17 65 views
2

假设我有以下矩阵:添加一个矩阵的列

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 

我怎么能以自动的方式做到这一点,因为在我来说,我有一个非常大的矩阵,并使用不同的值计数的载体?

回答

3

的一种方法是通过“计数”矢量复制“数”的序列,用它来split“垫”的列顺序通过listsapply返回list,循环使用列索引subset每个list元素的“垫子”并获得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 
2

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