2011-08-08 6 views
10

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 
+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 –

+1

. Tenga en cuenta que data.table puede ceder a mejora bastante sustancial en el tiempo de ejecución, incluso si no utiliza 'setkey' – Andrie

Respuesta

7

esto debería funcionar:

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) 

El paquete data.table contiene algunas clases de fecha/hora con el modo de almacenamiento entero. Ver ?IDateTime:

de fecha y hora con las clases de almacenamiento de número entero para una clasificación rápida y agrupación. ¡Aún experimental!

  • IDate es una clase fecha derivado de Date. Tiene la misma representación interna que la clase Date, excepto que el modo de almacenamiento es entero.
  • ITime es una clase de hora del día almacenada como el número entero de segundos en el día. as.ITime no permite días más de 24 horas. Como ITime se almacena en segundos, puede agregarlo a un objeto POSIXct, pero no debe agregarlo a un objeto Date.
  • IDateTime toma una entrada de fecha y hora y devuelve una tabla de datos con las columnas date y time.
+0

Gracias, eso ayuda. En realidad estoy usando lubridate, que a su vez funciona muy bien con ggplot2. Como los tres paquetes (lubridate, ggplot2, plyr) son del mismo autor y funcionan muy bien en combinación, creo que me quedaré un poco más con ellos en lugar de hacer el cambio. Pero su respuesta da una buena solución y cuando tengo tiempo creo que voy a jugar y probar las mejoras de velocidad con data.table. ¡Gracias de nuevo! –

Cuestiones relacionadas