domingo, 2 de abril de 2017

Apuntes sobre Data Table

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



No hay comentarios:

Publicar un comentario