r - 与用于组过滤的 data.frame 相比,data.table 速度较慢
问题描述
如果我根据数值过滤(大于或小于),data.table 会很慢
library(data.table)
df <- data.frame(group = sample(paste("group", 0:2000, sep = ""), 7000, replace = TRUE),
pvalue = 10^(sample(seq(from = -5, to = -1, by = 0.1), 7000, replace = TRUE)))
groups <- setdiff(unique(df$group), "group0")
# data.frame takes 0.16 sec
system.time( lapply(groups, function(r) {
df.temp <- df[df$group == r,]
any(df.temp[["pvalue"]] < 0.01, na.rm = TRUE)
}))
DT <- as.data.table(df)
setkeyv(DT, c("group"))
# data.table takes 0.9 sec
system.time(lapply(groups, function(r) any(DT[.(r), pvalue <= 0.01], na.rm = TRUE)))
有谁知道,我做错了什么?
解决方案
你没有data.table
正确使用。DT[
多次打电话很贵。相反,您可以执行以下操作
setkeyv(DT, c("group"))
DT[!("group0"), any(pvalue <= 0.01), by = group]
group V1
1: group1 TRUE
2: group10 TRUE
3: group100 TRUE
4: group1000 TRUE
5: group1001 TRUE
推荐阅读
- linux - 以前错误的未对齐呼叫现在工作了吗?
- javascript - 窗口大小改变时保持viewBox的比例
- regex - 用于嵌套 XML 标记的 PowerShell 正则表达式
- azure-cosmosdb - 昂贵的 gremlin 查询 - 可以提高效率吗?
- python - 基于同一组内另一行和另一列中的某个值分配值的有效方法
- c++ - 使用 SFINAE 禁用模板类成员函数
- ms-access - 更新 SQL 在 vba 中不起作用,但在查询设计中起作用?
- python - Scrapy Spider - 如何获取起始 url 并增加页面 # 以抓取页面值结尾?
- android - 如何强制移动版本的页面 webview
- android - 屏幕关闭后 Firestore 不更新