慢速数据表子集与dplyr

慢速数据表子集与dplyr,r,data.table,R,Data.table,我一直在使用以下格式的dplyr代码 group_by(dt, ID) %>% filter(any(colY == 1 & colX == 10)) 要将data.table子集,请执行以下操作 ID colX colY 1111 3 1 1111 2 1 1111 6 0 1111 9 0 2222 10 1 2222 3 1 2222 5 0 2222 7 0 3333 8

我一直在使用以下格式的dplyr代码

 group_by(dt, ID) %>%
    filter(any(colY == 1 & colX == 10))
要将data.table子集,请执行以下操作

ID colX colY 1111 3 1 1111 2 1 1111 6 0 1111 9 0 2222 10 1 2222 3 1 2222 5 0 2222 7 0 3333 8 1 3333 10 1 3333 3 0 3333 2 0
大约需要14秒。这里有什么问题吗

这可能会更快。它避免使用
.SD
,而是使用
.I
中给出的行号

dt[dt[, .I[any(colX == 10 & colY == 1)], by = ID]$V1]
#      ID colX colY
# 1: 2222   10    1
# 2: 2222    3    1
# 3: 2222    5    0
# 4: 2222    7    0
# 5: 3333    8    1
# 6: 3333   10    1
# 7: 3333    3    0
# 8: 3333    2    0
内部数据表调用
dt[,.I[any(colX==10&colY==1)],by=ID]$V1
为符合条件的组提供行号
.I
为我们提供每组的行位置。我们可以通过打印我们的呼叫来查看结果:

dt[, print(.I[any(colX == 10 & colY == 1)]), by = ID]
# integer(0)
# [1] 5 6 7 8
# [1]  9 10 11 12
# Empty data.table (0 rows) of 1 col: ID

然后我们只使用该结果作为原始数据表上的行子集。

,10]是您的
ID
列位置吗?也许您可以生成一些模拟数据,以便轻松为您测试现实的解决方案。很抱歉,本应按ids进行分组。这最终比我尝试的data.table子集快75倍。.SD拉了90k个组,这减慢了进程。lotJoins是另一种方法,如果有很多组
DT[(DT[(1,10),on=c(“colY”,“colX”),unique(ID)],on=“ID”]
将把它添加到我的链接堆中,作为
having=
参数
dt[dt[, .I[any(colX == 10 & colY == 1)], by = ID]$V1]
#      ID colX colY
# 1: 2222   10    1
# 2: 2222    3    1
# 3: 2222    5    0
# 4: 2222    7    0
# 5: 3333    8    1
# 6: 3333   10    1
# 7: 3333    3    0
# 8: 3333    2    0
dt[, print(.I[any(colX == 10 & colY == 1)]), by = ID]
# integer(0)
# [1] 5 6 7 8
# [1]  9 10 11 12
# Empty data.table (0 rows) of 1 col: ID