2016-09-30 73 views
0

一个子集我有两个data.tables:分配一个data.table的一个子集的另一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) 

我要分配在DT2到柱B和C柱B2和C2的元件在DT1其中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 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的 'A' 与 'A2' 和分配(:=)的兴趣列到 '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)] 
dt1[dt2, names(dt1)[3:4] := mget(names(dt2)[3:4]), on = .(A = A2)] 
相关问题