我有一个较大的master data.table和不同的进程,每个进程修改它的不同子集。然后我需要使用每个进程所做的更改来更新主表。
这是一个例子:
# Master table
dtA <- data.table(month=month.abb[1:5],act=letters[1:5],col1=(1:5)^2, col2=(5:9)^3)
# "subsidiary" table
dtB <- data.table(month=month.abb[3:4],act=letters[3:4],col1=(6:7)^3)
setkey(dtA, month,act)
setkey(dtB, month,act)
dtA
month act col1 col2
1: Apr d 16 512
2: Feb b 4 216
3: Jan a 1 125
4: Mar c 9 343
5: May e 25 729
dtB
month act col1
1: Apr d 343
2: Mar c 216
# The result I want is:
month act col1 col2
1: Apr d 343 512
2: Feb b 4 216
3: Jan a 1 125
4: Mar c 216 343
5: May e 25 729
几乎是偶然的,令我惊讶的是,由于我没有在其他地方看到过这种情况,我发现这种非常简单的方法可以实现:
dtA[dtB, col1:=i.col1]
我的问题:这是解决我的问题的合法方式,以及动态执行此操作的语法,例如如果我有很多列同时设置到我的主表中?
答案 0 :(得分:0)
动态更新多列的一种方法是使用按引用分配,并从data.table中选择要使用索引进行更新的列。这将使您不必键入所有列名称的分配。
此处的示例包括dtA中的附加列,用于演示不相等的表:
dtA <- data.table(month=month.abb[1:5],act=letters[1:5],col1=(1:5)^2, col2=(8:12)^2, col3=(13:17)^2)
dtB <- data.table(month=month.abb[3:4],act=letters[3:4],col1=(6:7)^3, col2=(13:14)^3)
setkey(dtA, month,act)
setkey(dtB, month,act)
dtA
month act col1 col2 col3
1: Apr d 343 2744 256
2: Feb b 4 81 196
3: Jan a 1 64 169
4: Mar c 216 2197 225
5: May e 25 144 289
dtB
month act col1 col2
1: Apr d 343 2744
2: Mar c 216 2197
# columns 3:4 are selected for updating
dtA[dtB[,list(month,act)], 3:4:=(dtB[,3:4,with=F])]
dtA
month act col1 col2 col3
1: Apr d 343 2744 256
2: Feb b 4 81 196
3: Jan a 1 64 169
4: Mar c 216 2197 225
5: May e 25 144 289