使用连接将值从一个数据表分配给另一个数据表

时间:2015-02-10 12:31:28

标签: r data.table

我有一个较大的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]

我的问题:这是解决我的问题的合法方式,以及动态执行此操作的语法,例如如果我有很多列同时设置到我的主表中?

1 个答案:

答案 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