首页 > 解决方案 > 根据聚合值过滤 data.table 的最有效方法

问题描述

什么是推荐/“最佳”方式(wrt 性能)data.table根据在该表的聚合形式上计算的某些标准来过滤 a。

Areprex会说 1000 多个单词:

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在过滤后的结果上使用另一个表达式) ,我想知道这些选项中的哪些通常可以很好地扩展到大型表

在我的真实案例场景中,我有大约 16 个 Mio 行,大约 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值。

标签: rdata.table

解决方案


我从这个帖子中学到了

你可以这样做。

DT[DT[,.I[all(x!=4)],by=.(grp)]$V1,]

推荐阅读