2016-09-30 10 views
0

のサブセットにdata.tableのサブセットを割り当てますDT1でどこ私はこのようになりますテーブルを取得することをA = A2、こうした:は、私は2つのdata.tablesを有する別のdata.table

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 

私は一度に一つの列を割り当てることができます知っている:

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] 

しかし、これはたくさんの行のコードのように思えます。

私は

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

のようなものを考えていたが仕事だろうが、私はエラーメッセージが表示されます。

よりスマートで、より良い方法はありますか?

答えて

2

我々はon 'A2' と 'A' に参加し、割り当てる行うことができます(:=) 'C' と '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 

がある場合に関心の列の値列を入力する代わりに、mgetを使用してvaluesを取得し、それを 'dt1'の対応する列名に割り当てます。

dt1[dt2, names(dt1)[3:4] := mget(names(dt2)[3:4]), on = .(A = A2)] 
関連する問題