La libreria "data.table" ofrece una "versión mejorada" de los Data Frame. Una de las mayores ventajas es que los Data Table ocupan 10 veces menos espacio que los Data Frame. Otra ventaja es la mejora en los tiempos de ejecución para leer y escribir un csv, hacer group by, ordenar una tabla, entre otras funciones.
Los Data Table pueden ser utilizados como Data Frame. Si se hace un class(miTabla) de un data.table se imprime una lista con dos valores: "data.table" "data.frame", identificando que los objetos Data Table también pueden ser considerados como Data Frame y las librerías que solo usan Data Frame no tendrían problemas al usar Data Table.
En el blog de Jan Gorecki (ver referencia Nro.4) se hace una comparación de eficiencia de los data.table. Se pueden destacar estas funciones, en linea roja las pertenecientes a la libreria data.table:
Para mas detalles sobre data.table, ver referencias.
script con funciones de data.table:
# version utilizada # data.table 1.10.4 # DATA TABLE # ---------------------------------------------------------------------- library(data.table) # Que es un data.table class(as.data.table(mtcars)) # resultado: "data.table" "data.frame" # convertir un data.frame en data.table dt <- as.data.table(mtcars) # crear un data.table inline dt <- data.table(a = 1:6, b = 7:12, c = 13:18) # READ.CSV vs FREAD(data.table function) # ---------------------------------------------------------------------- # Tiempos de READ.CSV para leer un csv de 38MB system.time(df<-read.csv("c:/data/dataset_mt.csv")) # resultados: # user system elapsed # 15.44 0.32 15.78 # Tiempos de FREAD para leer un csv de 38MB system.time(dt<-fread("c:/data/dataset_mt.csv",showProgress=F)) # resultados: # user system elapsed # 11.71 0.01 11.78 # WRITE.CSV vs FWRITE(data.table function) # ---------------------------------------------------------------------- # Tiempos de WRITE.CSV para escribir un csv de 160MB en disco df = mtcars[sample(32,1000000,T),] system.time(write.csv(df,file="c:/data/dataset_mt.csv",row.names=F)) # resultados: # user system elapsed # 62.41 0.49 63.86 # Tiempos de FWRITE para escribir un csv de 160MB en disco dt = as.data.table(mtcars[sample(32,1000000,T),]) system.time(fwrite(dt,file="c:/data/dataset_mt.csv",showProgress = F)) # resultados: # user system elapsed # 4.36 0.06 1.48 # GROUP BY en Data.Table # ---------------------------------------------------------------------- # GROUP BY iris_dt = as.data.table(iris) # promedio de Sepal.Length agrupado por Species iris_dt[, mean(Sepal.Length), by = Species] # promedio de Sepal.Length agrupado por Species solo casos donde sepal.length >=6 iris_dt[Sepal.Length >= 6, mean(Sepal.Length), by = Species] # BORRAR COLUMNAS Y NAs en Data.Table # ---------------------------------------------------------------------- # DROP. Borrar una columna 'vs' y 'am' del data.table mtcars_dt mtcars_dt <- as.data.table(mtcars) mtcars_dt[, c('vs','am') := NULL] # NAs. Eliminar las filas que contienen valores NA en un data.table mtcars_dt = na.omit(mtcars_dt) # JOINS en Data.Table # ---------------------------------------------------------------------- # crea data.tables dt1 = data.table(id_user=c(1,2,3,4), edad=c(42,52,62,66)) dt2 = data.table(id_user=c(1,2,3), cantidad=c(4,5,6)) # right outer join unkeyed data.tables - use `on` argument dt1[dt2, on = "id_user"] # join para "not in" dt1[!dt2, on = "id_user"] # inner join merge(dt1, dt2, by = "id_user") # full outer join merge(dt1, dt2, by = "id_user", all = TRUE) # FILTROS en Data.Table # ---------------------------------------------------------------------- dt <- as.data.table(iris) setosas <- dt[Species == 'setosa']
Referencia:
1. Introduccion a los data.table:
https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-intro.html
2. Resumen de funciones de librería data.table
https://s3.amazonaws.com/assets.datacamp.com/img/blog/data+table+cheat+sheet.pdf
3. Curso de Data.Table impartido por su creador, Matt Dowle:
https://www.datacamp.com/courses/data-table-data-manipulation-r-tutorial
4. Benchmark o comparación de rendimiento entre data.table y otras librerías
https://jangorecki.github.io/blog/2015-12-11/Solve-common-R-problems-efficiently-with-data.table.html
Muy interesante el blog. Quiero aprovechar para hacer una pregunta sobre R y analítica.
ResponderEliminarEstoy analizando las ventas de un retailer. Estas ventas están relacionadas con una serie de variables: var1, var2, var3, var4. La mayoría de ellas son continuas.
Para analizar la dependencia de las ventas respecto las variables creo una regresión lineal:
rg<-lm(sales ~ var1 + var2 + var3 + var4, data=sales_2017)
summary(rg)
Posteriormente quiero analizar el peso de cada variable y para ello uso (paquete caret):
varImp(rg, scale = FALSE)
rsimp <- varImp(rg, scale = FALSE)
plot(rsimp)
Es este un buen método para analizar el peso e importancia de las variables?, alguna recomendación?
Juan
Hola Juan
EliminarTe comento que hay mucha literatura y teoria sobre importancia de variables.
Sobre la funcion varImp de la libreria caret, esta te calcula diferentes medidas, segun el modelo que uses. Para la regresion lineal (lm) te calcula el t-value de cada variable. Para saber como se calcula el t-value, fijate en este link:
https://stats.stackexchange.com/questions/5135/interpretation-of-rs-lm-output
Para otros metodos sobre importancia de variables, este link te puede servir
https://www.linkedin.com/pulse/r-finding-most-important-predictor-variables-saranya-anandh?trk=hp-feed-article-title-like
Si necesitas ayuda especifica, escribeme a mi correo y veo si puedo colaborar
Espero te sirva
Suerte!!