【发布时间】:2020-03-10 17:48:42
【问题描述】:
据我了解,data.table 比 dplyr 更高效、更快,但我今天在工作中发现了相反的情况。我创建了一个模拟来解释这种情况。
library(data.table)
library(dplyr)
library(microbenchmark)
# data simulated
dt = data.table(A = sample(1:4247,10000, replace = T),
B = sample(1:119,10000,replace = T),
C = sample(1:6,10000,replace = T),
D = sample(1:30,10000,replace = T))
dt[,ID:=paste(A, ":::" ,
D,":::",
C)]
# execution time
microbenchmark(
DATA_TABLE = dt[, .(count=uniqueN(ID)),
by=c("A","B","C")
],
DPLYR = dt %>%
group_by(A,B,C) %>%
summarise(count = n_distinct(ID)),
times = 10
)
结果
Unit: milliseconds
expr min lq mean median uq max neval
DATA_TABLE 14241.57361 14305.67026 15585.80472 14651.16402 16244.22477 21367.56866 10
DPLYR 35.95123 37.63894 47.62637 48.56598 53.59919 62.63978 10
你可以看到很大的不同!有人知道原因吗?您对何时使用 dplyr 或 data.table 有什么建议吗?
我现在有了 data.table 语法的完整代码,由于这种情况,我不知道是否需要将一些代码块转换为 dplyr。
提前致谢。
【问题讨论】:
-
这个帖子可能有你需要知道的一切:stackoverflow.com/questions/21435339/…
-
我可以(在某种程度上)在我的机器 R-3.5.3、dplyr-0.8.3、data.table-1.12.8 上重现
data.table-slower。 -
@eipi10 可能是版本问题?使用 R 3.5.2、dplyr-0.8.3、data.table-1.12.6,我的 dplyr 速度提高了约 75 倍
-
即使将
uniqueN替换为length(distinct())也使这些方法具有相当的可比性。所以我认为真正的问题是为什么uniqueN(ID)在这里这么慢,甚至与length(unique(ID))相比? -
github.com/Rdatatable/data.table/issues/3739, "uniqueN() 与 length(unique()) 相比非常慢"
标签: r dplyr data.table