Recientemente descubrí el paquete data.table y ahora me preguntaba si debería o no sustituir parte de mi código plyr. En resumen, me gusta mucho plyr y básicamente logré todo lo que quería. Sin embargo, mi código funciona un tiempo y la perspectiva de acelerar las cosas fue suficiente para realizar algunas pruebas. Esas pruebas terminaron bastante pronto y esta es la razón.Uso de las fechas con el paquete data.table
Lo que hago muy a menudo con plyr es dividir mis datos por una columna que contiene fechas y hacer algunos cálculos:
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"]})
Sin embargo, el uso de una columna con el formato de fecha no parece funcionar en los datos .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.
Si entiendo correctamente el paquete, sólo consigo considerables aceleraciones cuando uso setkey(). Además, creo que no sería una buena codificación convertir constantemente entre Fecha y numérico. Entonces, ¿me estoy perdiendo algo o simplemente no hay una manera fácil de lograrlo con 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
No he utilizado data.table, pero tenga en cuenta que Sys.time() devuelve un valor de fecha y hora 'POSIXct', no una' Fecha'. En particular, el valor devuelto (el número de segundos transcurridos desde 1/1/1970) no es, en general, un valor integral, por lo que la conversión a un número entero perderá información ya que el mensaje de error dice –
. Tenga en cuenta que data.table puede ceder a mejora bastante sustancial en el tiempo de ejecución, incluso si no utiliza 'setkey' – Andrie