Почему "по" на векторе не из столбца 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

Похоже, я забыл обновить этот пост.

Это было исправлено долго в фиксации # 1039 версии 1.1. Из НОВОСТИ:

Исправлено #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