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

时间:2013-11-14 16:45:56

标签: 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

为什么第二种情况会慢?

这样做更快:

test[,y:=y]
test[,.N, by=y]
test[,y:=NULL]

看起来好像很差?

1 个答案:

答案 0 :(得分:2)

似乎我忘了更新这篇文章。

这是在v1.8.11的#1039提交中修复的。来自NEWS

  

已修复#5106其中DT[, .N, by=y]其中y是带length(y) = nrow(DT)的向量,但y不是DT中的列。感谢colinfang报告。

在v1.8.11 commit 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