将具有相同列名的矩阵中的列组合在一起

Eli*_*eth 4 aggregate r

我有一个矩阵与列重复字符列名称.

set.seed(1)
m <- matrix(sample(1:10,12,replace=TRUE), nrow = 3, ncol = 4, byrow = TRUE,
       dimnames = list(c("s1", "s2", "s3"),c("x", "y","x","y")))

m
   x y  x  y
s1 3 4  6 10
s2 3 9 10  7
s3 7 1  3  2
Run Code Online (Sandbox Code Playgroud)

我需要将具有相同列名的所有列合并为一列,即

m <- matrix(c(9,14,13,16,10,3), nrow = 3, ncol = , byrow = TRUE,dimnames = list(c("s1", "s2", "s3"),c("x", "y")))

    x  y
s1  9 14
s2 13 16
s3 10  3
Run Code Online (Sandbox Code Playgroud)

我在聚合函数中有一个简单总和的游戏,但没有任何运气.有什么建议?谢谢.

Jos*_*ien 8

那么,这个解决方案不会因为代码透明度而赢得任何奖项,但我更喜欢它:

nms <- colnames(m)
m %*% sapply(unique(nms),"==", nms)
#     x  y
# s1  9 14
# s2 13 16
# s3 10  3
Run Code Online (Sandbox Code Playgroud)

它的工作原理是构造一个矩阵,形成m列的适当线性组合.要了解它是如何工作的,请将第二行拆分为两个组成矩阵,使用它们相乘%*%,如下所示:

 -          -      -   -
|  3 4  6 10 |    | 1 0 |
|  3 9 10  7 |    | 0 1 |
|  7 1  3  2 |    | 1 0 |
 -          -     | 0 1 |
                   -   -
Run Code Online (Sandbox Code Playgroud)


And*_*rie 6

nms <- colnames(m)
sapply(unique(nms), function(i)rowSums(m[, nms==i]))

   x  y
s1  9 14
s2 13 16
s3 10  3
Run Code Online (Sandbox Code Playgroud)

  • @JoshO'Brien我担心你没有通过图灵测试.只有一个机器人会想出这样一个混淆的答案,然后弥补这样一个不太可能的借口. (4认同)