为什么不是来自data.table列的向量上的"by"非常慢?

col*_*ang 11 r data.table

test <- data.table(x=sample.int(10, 1000000, replace=TRUE))
y <- test$x
test[,.N, by=x] # fast
test[,.N, by=y] # extremely slow
Run Code Online (Sandbox Code Playgroud)

为什么在第二种情况下它很慢?

这样做更快:

test[,y:=y]
test[,.N, by=y]
test[,y:=NULL]
Run Code Online (Sandbox Code Playgroud)

它看起来好像很难优化?

Aru*_*run 2

好像忘记更新这篇文章了。

这个问题早在 v1.8.11 的提交 #1039 中就已修复。来自新闻

修复了#5106where是DT[, .N, by=y]y向量length(y) = nrow(DT),但y不是 中的列DT。感谢colinfang您的举报。

在 v1.8.11 提交 1187 上测试:

require(data.table)
test <- data.table(x=sample.int(10, 1000000, replace=TRUE))
y <- test$x

system.time(ans1 <- test[,.N, by=x])
#   user  system elapsed 
#  0.015   0.000   0.016 

system.time(ans2 <- test[,.N, by=y])
#   user  system elapsed 
#  0.015   0.000   0.015 

setnames(ans2, "y", "x")
identical(ans1, ans2) # [1] TRUE
Run Code Online (Sandbox Code Playgroud)