2011-04-21 6 views
7

입력 행렬R : 열과 행 이름에 따라 두 행렬을 병합하는 방법은 무엇입니까?

 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

당신은 byall 선택적 매개 변수를 지정하여이 작업을 수행 할 merge을 사용할 수 있습니다 : 당신이 제로로 NAS를 바꾸려면

#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 

을 얻을 것입니다,이 작업을해야합니다 :

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

멋진 솔루션입니다. 행렬을 다시 필요로한다면'rownames (newmatrix) <- Merged [, 1]'와 함께'as.matrix (Merged [-1])'를 추가 할 수 있습니다. –

관련 문제