在性能方面,基于对数据表进行聚合计算的条件来过滤data.table
,推荐使用哪种方法或最佳方式呢?
一个reprex
胜过千言万语:
library(data.table)
DT <- data.table(grp = rep(LETTERS[1:3], each = 3), x = 1:9)
setkey(DT, "grp")
DT[DT[, .(nok = any(x == 4)), by = grp][nok == FALSE]]
DT[DT[, .GRP[all(x != 4)], by = grp]]
我能立刻想到这两种解决方案,我的直觉告诉我第二种形式应该更好(存储较小的中间表,无需链接结果),但我想知道是否有一种规范的做法?
也许我一开始不需要使用连接,可以为i参数使用分组过滤器?
这显然不能按预期工作(by显然只对j产生影响):
DT[all(x != 4), by = grp]
虽然这个SO答案展示了另一种做法,但我的主要关注点是性能。因此,如果我想进一步处理过滤后的data.table(即在过滤结果上使用另一个j
表达式),我想知道这些选项中哪个通常适用于大型表。
在我的实际情况下,我有大约1600万行,大约40k个唯一键和14列。
因此,基准数据集可能如下所示:
bench <- data.table(keys = rep(paste0("k", 1:40000), 400))
bench[, paste0("cols", 1:13) := replicate(13, sample(40000 * 400, TRUE),
simplify = FALSE)]
虽然我正在寻找通用答案(如果可能的话),不考虑最终选择的过滤器,但实际上的过滤器将是查找包含任何NA
值的群组。