执行半反连接(在二进制搜索中)

时间:2016-02-04 02:36:21

标签: r data.table anti-join semi-join

我希望通过选择第一个键并排除第二个键来对data.table进行分组。

set.seed(18032)
DT <- data.table(grp1 = sample(10, 1000, T),
                 grp2 = sample(10, 1000, T),
                 v = rnorm(100), key = "grp1,grp2")

我的第一直觉不起作用(!操作得太早):

DT[.(10, !10)] #!10 = 0, chooses the (10,0) subset

这似乎太不优雅,但有效:

DT[.(10, setdiff(unique(grp2), 10))] #unique(grp2) %\% 10 for the bold ;-)

这也有效,但这种方法牺牲了一些功能(例如,:=DT的访问权限):

setkey(DT, grp2, grp1)
DT[!.(10)][CJ(grp2, 10, unique = TRUE)]
#equivalently
DT[!.(10)][.(unique(grp2), 10)]

我是否已经筋疲力尽,或者我遗失了什么?

1 个答案:

答案 0 :(得分:2)

这似乎符合我的预期:

DT[ grp1==10 & grp2 != 10, ]

如果在j -position中使用:=,似乎允许有针对性的分配。

作为一个例子,这应该成功(不会损失效率):

 DT[ grp1==10 & grp2 != 10, v := 0 ]