2011-04-21 165 views
7

輸入矩陣AR:如何根據列名和行名合併兩個矩陣?

 column1 column2 column3 column4 
row1 0   1   0   0 
row2 0   0   -1  0 
row3 1   0   0   -1 

輸入矩陣B

 column5 column6 column7 column8 
row1 0   1   0   0 
row2 0   0   -1  0 
row4 1   0   0   -1 

輸出矩陣C

 column1 column2 column3 column4 column5 column6 column7 column8 
row1 0   1   0   0   0   1   0   0 
row2 0   0   -1  0   0   0   -1  0 
row3 1   0   0   -1   0   0   0   0 
row4 0   0   0   0   1   0   0   -1 

備註:矩陣A和matrixB有重疊的行的名稱。但是,所有列的名稱都不相同。

回答

19

可以使用merge通過指定可選參數做到這一點byall

#Reading data 
txt1 <- "column1 column2 column3 column4 
row1 0   1   0   0 
row2 0   0   -1  0 
row3 1   0   0   -1 
" 

txt2 <- "column5 column6 column7 column8 
row1 0   1   0   0 
row2 0   0   -1  0 
row4 1   0   0   -1 
" 
dat1 <- read.table(textConnection(txt1), header = TRUE) 
dat2 <- read.table(textConnection(txt2), header = TRUE) 

#Merge them together 
merge(dat1, dat2, by = "row.names", all = TRUE) 

將產生

Row.names column1 column2 column3 column4 column5 column6 column7 column8 
1  row1  0  1  0  0  0  1  0  0 
2  row2  0  0  -1  0  0  0  -1  0 
3  row3  1  0  0  -1  NA  NA  NA  NA 
4  row4  NA  NA  NA  NA  1  0  0  -1 

如果你想用零來取代在NAS,這應該工作:

#Assign to an object 
zz <- merge(dat1, dat2, by = "row.names", all = TRUE) 
#Replace NA's with zeros 
zz[is.na(zz)] <- 0 
+2

很好的解決方案。如果他再次需要一個矩陣,你可以將'as.matrix(Merged [-1])'與'rownames(newmatrix)< - Merged [,1]'相加。 – 2011-04-21 09:03:08