【发布时间】:2020-08-06 16:08:21
【问题描述】:
什么是推荐的/“最佳”方式(wrt 性能)来过滤 data.table 基于在这个表格的聚合形式上计算的一些标准。
reprex 会说 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 answer 显示了另一种相同的做法,但我主要关心的是性能。因此,如果我想进一步处理过滤后的 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 值。
【问题讨论】:
-
这能回答你的问题吗? filter rows in data.table with `by`
-
部分,是的,它会进行过滤,但它没有回答众多选项中的哪一个表现出最高的性能。
-
然后我会用一些适合比较的实际基准和数据来更新问题。目前没有提到“性能”。
-
我收回了这一点,但是从整个帖子中并不清楚。如果你能提供一个有代表性的数据集也很好 - 考虑到你有多少列/行/组以及不同的变化,“性能”可能是相当相对的......
-
添加了基准数据集,明确了我真实案例场景的维度。
标签: r data.table