左联接从右 table 添加所有行
Left join adding all rows from right table
我注意到,当通过引用更新时,如果通过连接键有更多棕褐色的行,我会从右边丢失一些行 table。
我怎么浏览论坛都找不到怎么弄。有什么东西逃脱了我?
即使使用 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
我注意到,当通过引用更新时,如果通过连接键有更多棕褐色的行,我会从右边丢失一些行 table。
我怎么浏览论坛都找不到怎么弄。有什么东西逃脱了我?
即使使用 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