我正在尝试从具有“一起”列的列的矩阵转到已形成相关子矩阵的行总和的矩阵。即从
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]
[1,] 1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61
[2,] 2 6 10 14 18 22 26 30 34 38 42 46 50 54 58 62
[3,] 3 7 11 15 19 23 27 31 35 39 43 47 51 55 59 63
[4,] 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64
至
[,1] [,2] [,3] [,4] [,5]
[1,] 15 30 46 185 220
[2,] 18 32 48 190 224
[3,] 21 34 50 195 228
[4,] 24 36 52 200 232
我认为必须有一种比通过下面的方法遍历索引更优雅,更快捷的方法(特别是,我的真实矩阵更像是4000乘以数千)。
example <- matrix(1:64, nrow=4) myindex <- c(1,1,1,2,2,3,3,4,4,4,4,4,5,5,5,5) summed <- matrix( rep(unique(myindex), each=dim(example)[1]), nrow=dim(example)[1]) for (i in 1:length(unique(myindex))){ summed[,i] <- apply(X=example[,(myindex==i)], MARGIN=1, FUN=sum) }
可能是我缺乏应用和精打细算的经验,使我无法弄清这一点。当然也欢迎使用快速的dplyr方法。
最佳答案
我们可以将一个衬板与sapply
一起使用:
sapply(unique(myindex), function(x) rowSums(example[, which(myindex == x), drop = FALSE]))
[,1] [,2] [,3] [,4] [,5]
[1,] 15 30 46 185 220
[2,] 18 32 48 190 224
[3,] 21 34 50 195 228
[4,] 24 36 52 200 232
我们让
sapply
循环遍历myindex
的所有唯一值,并使用which
定义应包含在rowSums
中的列。编辑:包括
drop = FALSE
以防止单个索引简化为 vector 。感谢@ mt1022指出错误!