2013-10-05 153 views
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)中的值执行一些基本算术运算。希望这是有道理的。

非常感谢提前!

+0

+1对于预期输出的明确问题 –

回答

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 
+0

完美!非常感谢。 – amurphy

+1

@amurphy:你可能想检查答案,如果这是你正在寻找 – Metrics

+1

哎呀,完成。再次感谢。 – amurphy

0

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