2016-12-07 159 views
0

我有一個關於合併函數的基本問題。R:按列名合併矩陣

根據我的理解,合併(mat1,mat2)應該按列名合併矩陣,並保留矩陣中存在的矩陣。

我有兩個表(下面的例子)。行名稱不同,但某些列名是相同的。我想繼續保持在普通的列:

MAT1:

B C D E 
a x x x x 
b x x x x 
c x x x x 
d x x x x 
e x x x x 

和MAT2:

B E F G 
f y y y y 
g y y y y 
h y y y y 
i y y y y 
j y y y y 

所以輸出應該是這樣的:

B E 
a x x 
b x x 
c x x 
d x x 
e x x 
f y y 
g y y 
h y y 
i y y 
j y y 

但是,合併(mat1,mat2)返回:

> merge(test, testt) 
[1] B E C D F G 
<0 rows> (or 0-length row.names) 

我一定在做錯事。有什麼建議?謝謝!

+2

我想你想要'rbind(mat1 [,c(1,4)],mat2 [,c(1,2)])'而不是? – aichao

+1

'merge'不會做你認爲它做的事情。它在表之間執行連接(並且通常與'data.frame's一起使用,而不是與矩陣一起使用)。你的目標可能是用'commoncols <-intersect(colnames(mat1),colnames(mat2)); rbind(mat1 [,commoncols],mat2 [,commoncols])' – nicola

+0

@aichao不,因爲我不想指定哪些列是共同的列。我將這個應用到非常大的表 – arielle

回答

1

你可以用rbind做到這一點,並讓它自動檢查匹配的列名稱。

如果您使用的是data.table你可以這樣做:

DT1 = data.table(1:2,1:2) 
DT2 = data.table(1:2,1:2,1:2) 
rbind(DT1[,which(colnames(DT1) %in% colnames(DT2)),with = FALSE],DT2[,which(colnames(DT2) %in% colnames(DT1)),with = FALSE]) 

輸出:

V1 V2 
1 1 
2 2 
1 1 
2 2 

對於data.frame:

DF1 = data.frame(1:2,1:2) 
DF2 = data.frame(1:2,1:2,1:2) 
rbind(DF1[,which(colnames(DF1) %in% colnames(DF2))],DF2[,which(colnames(DF2) %in% colnames(DF1))]) 

輸出:

X1.2 X1.2.1 
    1  1 
    2  2 
    1  1 
    2  2 
+1

這很有效,謝謝! – arielle