不同维度矩阵的子集

4

假设我有两个不同维度的相似矩阵,其中一些row.names是相同的但顺序不同,例如:

> m1
            red   yellow     blue    green    black
red    0.000000 2.236068 4.472136 6.708204 8.944272
yellow 2.236068 0.000000 2.236068 4.472136 6.708204
blue   4.472136 2.236068 0.000000 2.236068 4.472136
green  6.708204 4.472136 2.236068 0.000000 2.236068
black  8.944272 6.708204 4.472136 2.236068 0.000000

> m2
         purple    green     blue     red
purple 0.000000 0.081172 4.472136 6.708204
green  0.081172 0.000000 0.107647 4.472136
blue   4.472136 0.107647 0.000000 0.073217
red    6.708204 4.472136 0.073217 0.000000

我希望将m1子集到一个新的矩阵中,该矩阵只包含与m2相同的行。最终结果应如下所示:
> m3
            red      blue    green    
red    0.000000  4.472136 6.708204 
blue   4.472136  0.000000 2.236068 
green  6.708204  2.236068 0.000000 

请注意,在“真正的”数据中,矩阵有数百个维度。似乎subset命令用于将数据子集化,但不是针对其他数据框或矩阵进行子集化?无论如何,我尝试创建了一个匹配项的索引,如下所示:
index <- m1 %in% m2 

这是可以的,但当使用cbind或for循环将此对象转换为新矩阵时,我会出现错误。我知道一定有一种相对快速或优雅的方法来做到这一点,但文档在这个问题上似乎有点简短。理想情况下,在将m1转换为m3之后,我想对m2m3中匹配元素的值执行一些基本算术运算,例如m2(2,3)-m3(3,2)= -2.128421。希望这样说得清楚明白。提前感谢您!

对于一个明确的问题并且有预期输出,给予+1。 - Ricardo Saporta
2个回答

3
  m3<-m1[row.names(m1) %in% row.names(m2),]
               red   yellow     blue    green    black
    red   0.000000 2.236068 4.472136 6.708204 8.944272
    blue  4.472136 2.236068 0.000000 2.236068 4.472136
    green 6.708204 4.472136 2.236068 0.000000 2.236068


     m3[,rownames(m3)]
           red     blue    green
red   0.000000 4.472136 6.708204
blue  4.472136 0.000000 2.236068
green 6.708204 2.236068 0.000000

1
@amurphy:如果这是您要寻找的内容,您可能希望将答案标记为已接受。 - Metrics

0
尝试类似于 merge(m1,m2,all.x = FALSE,all.y = TRUE,by ="colorrow") 这样的操作。首先必须将每个矩阵的行名取出,放入名为colorrow的列中。

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