2016-09-30 4 views
0

Ich habe zwei data.tables:Zuordnen einer Teilmenge von einer data.table auf eine Teilmenge eines anderen data.table

library(data.table) 
dt1 <- data.table(A=1:10, B=1, C=2, D=3) 
dt2 <- data.table(A2=5:9, B2=4, C2=5, D2=6) 

Ich möchte Elemente der Spalte B2 und C2 in dt2 bis Spalte B und C zugewiesen in DT1, wobei A = A2, so dass ich eine Tabelle, die wie folgt aussieht:

dt1 
#  A B C D 
# 1: 1 1 2 3 
# 2: 2 1 2 3 
# 3: 3 1 2 3 
# 4: 4 1 2 3 
# 5: 5 4 5 3 
# 6: 6 4 5 3 
# 7: 7 4 5 3 
# 8: 8 4 5 3 
# 9: 9 4 5 3 
# 10: 10 1 2 3 

ich weiß, dass ich eine Spalte zu einer Zeit zuordnen:

id1 <- which(dt1$A %in% dt2$A2) 
id2 <- which(dt2$A2 %in% dt1$A) 
dt1$B[id1] <- dt2$B2[id2] 
dt1$C[id1] <- dt2$C2[id2] 

jedoch scheint dies eine Menge Codezeilen zu sein, um nur sehr wenig zu tun, besonders wenn ich viele Spalten habe.

Ich dachte so etwas wie

# Not working: 
dt1[id1][,list(B,C)] <- dt2[id2][,list(B2,C2)] 

funktionieren würde, aber ich erhalte eine Fehlermeldung.

Gibt es einen klügeren, schöneren Weg, es zu tun?

Antwort

2

Wir können ein on treten die 'A' mit 'A2' und weist (:=) die Werte der Spalten von Interesse 'C' und 'D'

library(data.table)#v1.9.7+ 
dt1[dt2, c('C', 'D') := .(C2, D2), on = .(A= A2)] 
dt1 
#  A B C D 
# 1: 1 1 2 3 
# 2: 2 1 2 3 
# 3: 3 1 2 3 
# 4: 4 1 2 3 
# 5: 5 1 5 6 
# 6: 6 1 5 6 
# 7: 7 1 5 6 
# 8: 8 1 5 6 
# 9: 9 1 5 6 
#10: 10 1 2 3 

Wenn es viele Spalten, die wir ändern müssen, anstatt die Spalten eingeben aus, erhalten wir die valuesmget mit und weisen sie den entsprechenden Spaltennamen in ‚DT1‘

dt1[dt2, names(dt1)[3:4] := mget(names(dt2)[3:4]), on = .(A = A2)] 
Verwandte Themen