Использование дат с пакетом data.table - PullRequest
10 голосов
/ 08 августа 2011

Я недавно обнаружил пакет data.table и теперь задавался вопросом, должен ли я заменить часть своего plyr-кода. Подводя итог, мне действительно нравится plyr, и я в основном достиг всего, чего хотел. Тем не менее, мой код выполняется некоторое время, и для ускорения некоторых тестов мне хватило перспективы ускорения. Эти тесты закончились довольно скоро, и вот причина.

Что я часто делаю с plyr, так это разбиваю мои данные на столбец с датами и выполняю некоторые вычисления:

library(plyr)
DF <-  data.frame(Date=rep(c(Sys.time(), Sys.time() + 60), each=6), y=c(rnorm(6, 1), rnorm(6, -1)))
#Split up data and apply arbitrary function
ddply(DF, .(Date), function(df){mean(df$y) - df[nrow(df), "y"]})

Однако использование столбца с форматом даты, похоже, не работает в data.table:

library(data.table)
DT <- data.table(Date=rep(c(Sys.time(), Sys.time() + 60), each=6), y=c(rnorm(6, 1), rnorm(6, -1)))
setkey(DT, Date)
#Error in setkey(DT, Date) : Column 'Date' cannot be auto converted to integer without losing information.

Если я правильно понимаю пакет, я получу существенное ускорение только при использовании setkey (). Кроме того, я думаю, что было бы нехорошо кодировать постоянно конвертировать между датой и цифрой. Так что я что-то упустил или просто нет простого способа добиться этого с помощью data.table?

sessionInfo()
R version 2.13.1 (2011-07-08)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] C

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.6.3 zoo_1.7-2        lubridate_0.2.5  ggplot2_0.8.9    proto_0.3-9.2    reshape_0.8.4   
[7] reshape2_1.1     xtable_1.5-6     plyr_1.5.2      

loaded via a namespace (and not attached):
[1] digest_0.5.0    lattice_0.19-30 stringr_0.5     tools_2.13.1 

1 Ответ

7 голосов
/ 08 августа 2011

Это должно работать:

DT <- data.table(Date=as.ITime(rep(c(Sys.time(), Sys.time() + 60), each=6)),
                 y=c(rnorm(6, 1), rnorm(6, -1)))
setkey(DT, Date)

Пакет data.table содержит несколько классов даты / времени с целочисленным режимом хранения.См. ?IDateTime:

Классы даты и времени с целочисленным хранилищем для быстрой сортировки и группировки.Все еще экспериментальный!

  • IDate - это класс дат, полученный из Date.Он имеет то же внутреннее представление, что и класс Date, за исключением того, что режим хранения является целочисленным.
  • ITime - это класс времени дня, сохраняемый как целое число секунд в дне.as.ITime не допускает дней длиннее 24 часов.Поскольку ITime хранится в секундах, вы можете добавить его к объекту POSIXct, но не следует добавлять его к объекту Date.
  • IDateTime принимает ввод даты и времени и возвращаеттаблица данных со столбцами date и time.
...