Ответ 1
Обновление 5 июня 2014 года:
В текущей версии версии data.table v1.9.3 реализованы две новые функции: setorder
и setorderv
, что делает именно то, что вам нужно. Эти функции переупорядочивают data.table
по ссылке с возможностью выбора либо по возрастанию, либо по убыванию в каждом столбце для заказа. Для получения дополнительной информации посетите ?setorder
.
Кроме того, DT[order(.)]
также по умолчанию оптимизирован для использования data.table
внутреннего быстрого порядка вместо base:::order
. Это, в отличие от setorder
, сделает всю копию данных и, следовательно, будет менее эффективной с точки зрения памяти, но будет по-прежнему на порядок быстрее, чем при использовании базового порядка.
Ориентиры:
Здесь приведено описание разности скоростей с помощью setorder
, внутреннего быстрого порядка данных .table и с base:::order
:
require(data.table) ## 1.9.3
set.seed(1L)
DT <- data.table(Year = sample(1950:2000, 3e6, TRUE),
memberID = sample(paste0("V", 1:1e4), 3e6, TRUE),
month = sample(12, 3e6, TRUE))
## using base:::order
system.time(ans1 <- DT[base:::order(Year, memberID, -month)])
# user system elapsed
# 76.909 0.262 81.266
## optimised to use data.table fast order
system.time(ans2 <- DT[order(Year, memberID, -month)])
# user system elapsed
# 0.985 0.030 1.027
## reorders by reference
system.time(setorder(DT, Year, memberID, -month))
# user system elapsed
# 0.585 0.013 0.600
## or alternatively
## setorderv(DT, c("Year", "memberID", "month"), c(1,1,-1))
## are they equal?
identical(ans2, DT) # [1] TRUE
identical(ans1, ans2) # [1] TRUE
В этих данных контрольные показатели показывают, что порядок данных .table примерно ~ 79x быстрее, чем base:::order
и setorder
~ 135x быстрее, чем base:::order
здесь.
data.table
всегда сортирует/заказывает в C-locale. Если вам нужно будет заказать другой язык, только тогда вам нужно прибегнуть к использованию DT[base:::order(.)]
.
Все эти новые оптимизации и функции вместе составляют FR # 2405. добавлена поддержка bit64:: integer64.
ПРИМЕЧАНИЕ. Пожалуйста, обратитесь к истории/ревизиям для более раннего ответа и обновлений.