我正在尝试从具有“一起”列的列的矩阵转到已形成相关子矩阵的行总和的矩阵。即从

     [,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指出错误!

10-04 21:52