我运行了一些基准测试
library(dplyr)
library(data.table)
library(microbenchmark)
dt.data.frame.way <- function(data) data[X > 0 & Y > 0 & Z > 0]
dplyr.way <- function(df) filter(df, X > 0, Y > 0, Z > 0)
real.data.frame.way <- function(df) df[df$X > 0 & df$Y > 0 & df$Z > 0,]
data <- data.table(X=seq(-5,5,1), Y=seq(-5,5,1), Z=seq(-5,5,1))
setkey(data, X, Y, Z)
df <- as.data.frame(data)
microbenchmark(times = 10,
dt.data.frame.way(data),
dplyr.way(df),
real.data.frame.way(df))
将示例数据简单克隆到5.5M行。
data <- data.table(X=seq(-5,5,1), Y=seq(-5,5,1), Z=seq(-5,5,1))
data <- rbindlist(lapply(1:5e5, function(i) data))
setkey(data, X, Y, Z)
df <- as.data.frame(data)
microbenchmark(times = 10,
dt.data.frame.way(data),
dplyr.way(df),
real.data.frame.way(df))
看起来那个任务的性能很难提高。通常这取决于数据。
J
表示“连接”,它将对象作为第一步进行子集化;但是通过不等式进行子集化才是data.frame的正常方式。 - Franki
进行一些优化,以便在使用不等式时可以使用键(key)实现。我想人们可以从介绍中得到这个观点,不要使用==
,然后期望类似的概念适用于向量扫描>
。甚至==
也应该使用键(key),因为这更自然。 - Matt Dowle.&(keyvar1的条件, keyvar2的条件,...)
这样的东西?我猜目前你需要做的是tmp <- CJ(keyvars)[conds]; DT[tmp]
- FrankDT[X > 0 & Y > 0 & Z > 0]
将自动使用关键字。由于这是R语言,我们可以在评估之前优化i
表达式。 - Matt Dowle|
或&
的组合使用==
、>
和<
,那就可以开始了。如果这不是优化后的模式,那它就会回退到常规向量扫描。次要键可以自动构建并缓存。 - Matt Dowle