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

2番目のケースで遅いのはなぜですか?

これを行うとさらに高速です。

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

最適化が不十分なように見えますか?

4

1 に答える 1

2

この記事を更新するのを忘れていたようです。

これは、v1.8.11 のコミット #1039 でかなり前に修正されました。NEWSより

は のベクトルです#5106が、の列ではありませDT[, .N, by=y]ん。ご報告ありがとうございます。ylength(y) = nrow(DT)yDTcolinfang

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
于 2014-02-24T19:31:21.660 に答える