【发布时间】:2022-01-09 03:52:36
【问题描述】:
假设我想跟踪一个 data.table 中的哪些行被合并到另一个 data.table。有没有办法一次/合并时做到这一点?请参阅下面的示例以及我通常使用的方式。但是,这似乎效率很低。
示例
library(data.table)
# initial data
DT = data.table(x = c(1,1,1,2,2,1,1,2,2),
y = c(1,3,6))
# data to merge
DTx <- data.table(x = 1:3,
y = 1,
k = "X")
# regular update join
copy(DT)[DTx,
on = .(x, y),
k := i.k][]
#> x y k
#> 1: 1 1 X
#> 2: 1 3 <NA>
#> 3: 1 6 <NA>
#> 4: 2 1 X
#> 5: 2 3 <NA>
#> 6: 1 6 <NA>
#> 7: 1 1 X
#> 8: 2 3 <NA>
#> 9: 2 6 <NA>
# DTx remains the same
DTx
#> x y k
#> 1: 1 1 X
#> 2: 2 1 X
#> 3: 3 1 X
我通常做什么:
# set an Id variable
DTx[, Id := .I]
# assign the Id in merge
DT[DTx,
on = .(x, y),
`:=`(k = i.k,
matched_id = i.Id)][]
#> x y k matched_id
#> 1: 1 1 X 1
#> 2: 1 3 <NA> NA
#> 3: 1 6 <NA> NA
#> 4: 2 1 X 2
#> 5: 2 3 <NA> NA
#> 6: 1 6 <NA> NA
#> 7: 1 1 X 1
#> 8: 2 3 <NA> NA
#> 9: 2 6 <NA> NA
# use matched_id to find merged rows
DTx[, matched := fifelse(Id %in% DT$matched_id, TRUE, FALSE)]
DTx
#> x y k Id matched
#> 1: 1 1 X 1 TRUE
#> 2: 2 1 X 2 TRUE
#> 3: 3 1 X 3 FALSE
【问题讨论】:
-
我还没有看到任何支持就地修改 both 帧的合并/加入机制,即使使用
data.table的引用语义也是如此。我认为您对matched := ...的使用是我目前能想到的最好的。 -
(坦率地说,这里不需要
fifelse...只需matched := Id %in% DT$matched_id就足够了。) -
好点!并感谢您的想法
-
感谢提示。但是,它只返回
DT中的行,因此我仍然需要加入两次,这通常比我的常规替代方法效率低 -
要在双方都匹配,您需要访问内部函数。截至目前,我不确定是否有一个你可以很好地获得它。查看 merglist PR github.com/Rdatatable/data.table/pull/4370 查看 dtmerge 函数。
标签: r merge data.table