我注意到,当使用引用更新时,如果通过连接键有多个行,我会从右表中丢失一些行。不管我怎么浏览论坛,我都找不到怎么做。有什么事我忘了?即使使用mult=
,它似乎也不起作用。
由于性能和体积问题,我希望通过参考保持更新。
在我的表达式中,我期望a=2
A <- data.table(a = 1:4, b = 12:15)
B <- data.table(a = c(2,2,5), b = 23:25)
A[B, on = 'a', newvar := i.b, mult = 'all']
谢谢! !
一种选择是在'B'中创建list
列,并执行连接和分配(:=
),因为:=
不能在原始数据上扩展行。
A[B[, .(b = .(b)), a], on = .(a), newvar := i.b]
与产出
> A
a b newvar
1: 1 12
2: 2 13 23,24
3: 3 14
4: 4 15
一旦我们有了list
,unnest
就更容易了
library(tidyr)
A[, unnest(.SD, newvar, keep_empty = TRUE)]
# A tibble: 5 x 3
a b newvar
<int> <int> <int>
1 1 12 NA
2 2 13 23
3 2 13 24
4 3 14 NA
5 4 15 NA
或者使用与merge.data.table
的全连接
merge(A, B, by = 'a', all.x = TRUE)
a b.x b.y
1: 1 12 NA
2: 2 13 23
3: 2 13 24
4: 3 14 NA
5: 4 15 NA