2013-04-16 19 views
7

Wenn ich richtig verstehe, fusioniert standardmäßig zwei Tabellen durch den Vergleich von Spalten, die als Schlüssel festgelegt sind und denselben Namen haben. Wie soll ich schreiben, wenn ich Tabellen mit verschiedenen Spaltennamen habe? Zum Beispiel:Tabellen mit verschiedenen Spaltennamen verschmelzen

set.seed(123) 
DT1<-data.table(col1=sample(letters,5,replace=TRUE),col2=sample(LETTERS[1:5],5,replace=TRUE),col3=sample(1:2,5,replace=TRUE)) 
DT2<-data.table(col4=sample(1:3,10,replace=TRUE),col5=sample(LETTERS[1:5],10,replace=TRUE),col6=sample(1:100,10,replace=TRUE)) 
(DT1) 
(DT2) 

> (DT1) 
    col1 col2 col3 
1: h A 2 
2: u C 1 
3: k E 2 
4: w C 2 
5: y C 1 
> (DT2) 
    col4 col5 col6 
1: 3 D 48 
2: 1 C 76 
3: 1 C 22 
4: 1 B 32 
5: 3 A 24 
6: 3 E 15 
7: 3 E 42 
8: 2 D 42 
9: 3 D 37 
10: 2 A 16 

Was soll ich in DT1[ schreibe eine Zusammenführung der Auswahl nur Zeilen mit col2 == COL5 & col3 == col4 zu machen? Hier ist eine erwartete Ausgabe:

col1 col2 col3 col4 col5 col6 
    h A 2 2 A 16 
    u C 1 1 C 76 
    u C 1 1 C 22 
    y C 1 1 C 76 
    y C 1 1 C 22 

Vielen Dank im Voraus!

+0

Können Sie uns die Ausgabe zeigen, die Sie erwarten? – Arun

+0

sicher, nur eine Sekunde –

+0

Ich füge hinzu, dass dies eine gute Frage zu berücksichtigen ist, wenn Sie versuchen herauszufinden, warum 'data.table' in den" falschen "Spalten zusammengeführt, wenn Sie die Schlüssel nicht umsichtig angegeben haben. – MichaelChirico

Antwort

21

Mit data.table der Teilmenge auf Basis verbindet sich mit dem vor kurzem implementiert on= Argumente entlang und nomatch=0L ist dies einfach:

DT2[DT1, on=c(col5="col2", col4="col3"), nomatch=0L] 

Siehe secondary indices Vignette für mehr.


Alternativ, wenn Sie die data.tables eingegeben haben, dann können Sie das on= Argument überspringen. Die obige Lösung wäre jedoch idiomatisch, da sie die Reihenfolge der ursprünglichen data.tables beibehält, und es ist klar, anhand des Codes festzustellen, welche Spalten gesucht werden.

setkey(DT1, col2, col3) 
setkey(DT2, col5, col4) 
DT2[DT1, nomatch=0L] 

Siehe Verlauf für ältere Versionen.

+0

großartig! Ich kannte diese Details von 'setkey' nicht. Vielen Dank! –

Verwandte Themen