将矩阵中具有相同列名的列合并

5

我有一个矩阵,其中存在重复的字符列名。

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

我需要将所有列名相同的列合并成一列,即:
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

我已经尝试使用聚合函数中的简单求和,但是没有成功。有什么建议吗?谢谢。


1
建议 #1:提供一个最小化的可重现示例 - Joshua Ulrich
我可以用多种方式解释你的问题,这使得难以理解。请发布样本数据和期望结果。 - Andrie
请注意,以下是关于编程的内容,请将其翻译为中文。只返回翻译后的文本:顺便提一下,汇总函数是什么?简单求和吗? - Andrie
@JoshO'Brien 这是因为输入数据是随机的。我编辑了问题以添加种子,但显然对随机数据进行任何操作都会类似于随机性... 希望 OP 能在几分钟内解决这个问题。她似乎非常负责。 - Andrie
刚刚修复了它,使其匹配。我只需要合并具有相同名称的列,即x和y。 - Elizabeth
显示剩余6条评论
2个回答

8

好的,这个解决方案的代码透明度可能不会赢得任何奖项,但我还是很喜欢它:

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

它的工作原理是构建一个矩阵,形成适当的 m 列的线性组合。为了理解其工作原理,请将第二行分解为两个组件矩阵,并使用 %*% 相乘,如下所示:
 -          -      -   -
|  3 4  6 10 |    | 1 0 |
|  3 9 10  7 |    | 0 1 |
|  7 1  3  2 |    | 1 0 |
 -          -     | 0 1 |
                   -   -

+1 因为我已经花了很多时间去弄清楚 OP 想要什么,而你还是抢先一步了 :-) 另外,我也不知道你做了什么! - Andrie
谢谢。它完美地运行,但目前我不太明白为什么,但我会逐渐理解它的。 - Elizabeth
@Elizabeth -- 我刚刚添加了一点解释。那行代码中有许多 R 技巧;可能不是很清楚,但出于同样的原因,它可能会回报你所付出的注意力。 - Josh O'Brien
太棒了 - 我刚刚也让这个针对稀疏矩阵对象工作了,使用一个稀疏逻辑矩阵乘以一个dgCMatrix。 - Ken Benoit

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

   x  y
s1  9 14
s2 13 16
s3 10  3

感谢您帮助我澄清问题并提供答案! - Elizabeth
1
+1 我确实感觉自己像个小偷,如果我没有被某种防火墙当作机器人对待,并且不让我发表任何评论,我早就会坦白了。仍然震惊于我的奇怪的代码行竟然被接受了! - Josh O'Brien
4
很抱歉,您未通过图灵测试。只有机器人才会想出这样晦涩的答案,然后编造这样不太可能的借口。 - Andrie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接