Использование дат с пакетом data.table
Недавно я обнаружил пакет 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"]})
Однако использование столбца с форматом Date не работает в 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(). Кроме того, я думаю, что не будет хорошей кодировкой для постоянного преобразования между Date и numeric. Так что я чего-то не хватает или просто нет простого способа добиться этого с помощью 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
Это должно работать:
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
.