分配一个data.table的一个子集的另一data.table
问题描述:
一个子集我有两个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)]
会的工作,但我得到一个错误信息。
有没有更聪明,更好的方法来做到这一点?
答
我们可以做一个加入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)]