首页 > 解决方案 > 与用于组过滤的 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)))

有谁知道,我做错了什么?

标签: rdata.table

解决方案


你没有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

推荐阅读