2015-11-17 67 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