如何进行按引用更新连接?

dja*_*jas 5 r data.table

我正在尝试执行两个数据表的笛卡尔连接。因为我的表很大(10 Gb),所以我需要以内存高效的方式执行此操作。所以我想我会以一种以 - 为中心的方式通过引用更新其中一个表data.table

这就是我想要实现的目标:

# fake data
A = data.table(id = c(1, 1, 1, 2, 2, 3),  
               X = 0:5, 
               Y = letters[1:6], 
               key = 'id')

B = data.table(id = rep(1:3, each = 3) ,  
               time = rep(1:3, 3), 
               Z = 8:0, 
               key = c('id', 'time'))

# the desired join: cartesian join with columns from both tables
B[A, on = 'id', allow.cartesian = T]
Run Code Online (Sandbox Code Playgroud)

但是,此解决方案中没有更新任何表。出于内存原因,我想避免创建第三个表。

如何通过引用更新其中一个表(AB)来实现此目的?

部分受到这个问题答案的启发,这是我尝试过但没有成功的方法:

# table B gets the new columns, but not the new rows :(
B[A, allow.cartesian = T, `:=` (X = i.X, Y = i.Y)]
Run Code Online (Sandbox Code Playgroud)

作为奖励,如果我不必拼写出表中的每一列A(如 中所示:= (X = i.X, Y = i.Y)),那就太好了,因为我想使用 A 中的所有列。

想法?

Bil*_*y34 3

有一些奇怪的事情。根据假设代表真实数据的虚假数据,A 和 B 中都有重复的 id。

对 A 和 B 进行笛卡尔合并是完全合法的,但会在内存中创建一个新的 data.table。

如果您想使用:=此功能进行更新合并,可以对一对多关系进行更新合并,但不能对多对多关系进行更新合并。

您不能说“通过将多个链接值放入同一字段来更新此行!”

对于多对多,您可以使用链接值的聚合值更新当前行,使用by=.EACHI聚合函数,例如sum, mean or .N