2013-10-05 81 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的列中。