缓慢的data.table子集与dplyr

时间:2017-10-09 02:29:03

标签: 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   1
3333    10  1
3333    3   0
3333    2   0

进入

ID  colX    colY
2222    10  1
2222    3   1
2222    5   0
2222    7   0
3333    8   1
3333    10  1
3333    3   0
3333    2   0

过滤大约900k行以获得第二个表大约需要1.3秒。

我一直在尝试实现一个更快的data.table子集,但到目前为止结果只花了更长时间。使用以下data.table子集

dt[ , .SD[any( (colY == 1 & colX == 10)) ], ID]

需要大约14秒。这里似乎有什么问题?

1 个答案:

答案 0 :(得分:4)

这可能会更快。它避免使用.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

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