r - 根据聚合值过滤 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
值。
解决方案
推荐阅读
- javascript - 提取存储在字符串中的数据
- laravel - 如何获取语言环境(语言)的名称,而不仅仅是语言环境字符串,而是 LARAVEL 中该语言的名称?
- javascript - 如何通过 Java 脚本调用 Angular 组件
- c# - 多语言实体映射
- .net - Azure 应用程序网关返回随机 502 错误
- jquery - 如何在谷歌地图中使用链接
- keras - 将 keras h5 模型文件转换为 tflite 的问题 - 类型错误('关键字参数不理解:','插值')
- pandas - if nan python pandas循环
- javascript - javascript:正则表达式模式
- ember.js - ember中如何处理非模型数据