2016-12-07 4 views
0

Ich habe eine grundlegende Frage zur Zusammenführungsfunktion.R: Zusammenführen von Matrizen nach Spaltennamen

Aus meinem Verständnis, Merge (Mat1, Mat2) soll Matrizen durch Spaltennamen zusammenführen, halten die in beiden Matrizen vorhanden.

Ich habe zwei Tabellen (Beispiele unten). Die Zeilennamen sind unterschiedlich, aber einige Spaltennamen sind gemeinsam. Ich möchte die Spalten halten, die gemeinsam sind:

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 

und 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 

so wird der Ausgang so etwas wie soll:

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 

Merge (Mat1, Mat2) gibt jedoch zurück:

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

Ich muss etwas falsch machen. Irgendein Rat? Vielen Dank!

+2

Ich denke du willst 'rbind (mat1 [, c (1,4)], mat2 [, c (1,2)])' stattdessen? – aichao

+1

'merge' macht nicht, was Sie denken, dass es tut. Es führt einen Join zwischen Tabellen aus (und wird oft mit 'data.frame's und nicht mit Matrizen verwendet). Ihr Ziel ist vielleicht erreicht mit 'commoncols <-intersect (Spaltennamen (Mat1), Spaltennamen (Mat2)); rbind (mat1 [, commoncols], mat2 [, commoncols]) ' – nicola

+0

@aichao nein, da ich nicht angeben möchte, welche Spalten gemeinsam sind. Ich werde dies auf sehr große Tabellen anwenden – arielle

Antwort

1

Sie können dies mit rbind tun und automatisch nach übereinstimmenden Spaltennamen suchen lassen.

Wenn Sie eine data.table verwenden können Sie dies tun:

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]) 

Ausgang:

V1 V2 
1 1 
2 2 
1 1 
2 2 

Für eine 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))]) 

Ausgang:

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

Das funktioniert, danke! – arielle

Verwandte Themen