【发布时间】:2019-06-19 01:14:57
【问题描述】:
我有许多数据集,最终将相互比较。我已经阅读了该 data.table 并使用 lapply 是分析数据的最快方法,并在帖子中看到了一些基准比较。我注意到随着数据集变大并进行了一些基准测试,它有点滞后,并且比仅使用“总结”要慢得多。包括一个非常基本的表格和代码,以防我遗漏了有关如何优化 data.table 速度的内容。
ARM <- rep(seq(1:10), 10000)
TEST <- rep(seq(1:100), 1000)
TIME <- rep(seq(1:5), 20000)
SEX <- rep(1:2, 50000)
RESULTS <- rnorm(100000, mean = 50, sd = 10)
tst <- as.data.frame(cbind(ARM, TEST, TIME, SEX, RESULTS))
tstdt <- as.data.table(tst)
setDT(tstdt)
microbenchmark(tstdt[,.(n = .N), by = list(ARM, TEST, TIME, SEX)],
tst %>% group_by(ARM, TEST, TIME, SEX) %>% summarize(mean = mean(TEST),n = n()),
tstdt[,(lapply(.SD, mean)), by = .(ARM, TEST, TIME, SEX), .SDcols = "TEST"])
summary 方法的结果是最快的。
min lq mean median uq max neval
1 19.65800 21.841651 23.75156 22.585946 23.572930 43.24424 100
2 8.01111 8.487736 9.36991 8.852225 9.451928 19.27691 100
3 22.43461 23.452590 25.07495 24.179198 25.047663 85.74855 100
任何有关如何优化 data.tables 的信息或帮助解决我出错的地方都将不胜感激。
建议使用更大的数据和代码进行基准测试,包括可配置的更大数据、更少的运行次数、不使用.SDcols,以及取RESULTS 列的平均值。
library(dplyr)
library(data.table)
n = 5e6
ARM <- rep(seq(1:10), n / 10)
TEST <- rep(seq(1:100), n / 100)
TIME <- rep(seq(1:5), n / 5)
SEX <- rep(1:2, n / 2)
RESULTS <- rnorm(n, mean = 50, sd = 10)
tst <- data.frame(ARM, TEST, TIME, SEX, RESULTS)
tstdt <- as.data.table(tst)
setDT(tstdt)
microbenchmark::microbenchmark(
dplyr = tst %>% group_by(ARM, TEST, TIME, SEX) %>% summarize(mean = mean(RESULTS),n = n()),
dt = tstdt[, .(mean = mean(RESULTS), n = .N), by = .(ARM, TEST, TIME, SEX)],
times = 10
)
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: r data.table lapply