子集不同维度的矩阵

时间:2013-10-05 23:47:53

标签: r matrix similarity

假设我有两个不同维度的相似性矩阵,它们的一些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。希望这是有道理的。

非常感谢提前!!

2 个答案:

答案 0 :(得分: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 :(得分:0)

尝试merge(m1,m2,all.x=FALSE,all.y=TRUE,by="colorrow")之类的内容。首先,必须将每个矩阵的rownames放入名为colorrow的列中。