假设我有以下矩阵:
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”序列,使用它来分割
“mat”的列序列以返回一个列表
,使用 sapply
循环遍历 list
,使用列索引对每个 list
元素的“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
关于r - 根据另一个向量的值添加矩阵的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33764871/