Tutorial de data.table en R: introducción a DT[i, j, by]
Este tutorial gratuito de data.table en R explica los conceptos básicos y la sintaxis del paquete data.table para R. Domina la sintaxis de data.table ahora.
Este tutorial de data.table en R explica los fundamentos del comando DT[i, j, by], que es el núcleo del paquete data.table. Si quieres profundizar en el paquete, DataCamp ofrece un curso interactivo de R sobre el paquete data.table. El curso incluye más de 35 ejercicios interactivos de R —todo desde tu navegador— y varios vídeos con MattDowle, autor principal del paquete data.table, y Arun Srinivasan, uno de sus principales contribuidores. Pruébalo gratis.
Si ya has trabajado con conjuntos de datos grandes en RAM (de 1 a más de 100 GB), sabrás que un data.frame puede quedarse corto: hay operaciones que tardan demasiado. Data.table resuelve este problema reduciendo los tiempos de cómputo. Además, te permite hacer más con menos tecleo. Una vez domines la sintaxis de data.table con este tutorial, te sorprenderá lo sencillo que es realizar operaciones complejas. Así que no solo reducirás el tiempo de cómputo, sino también el tiempo de programación.
El comando DT[i,j,by] tiene tres partes: i, j y by. Si piensas en términos de SQL, i equivale a WHERE, j a SELECT y by a GROUP BY. Solemos describir el comando así: “Toma DT, selecciona filas con ‘i’, luego calcula ‘j’ agrupando por ‘by’”. Con un ejemplo sencillo y usando el conjunto de datos hflights (para que puedas reproducirlo), quedaría así:
library(hflights)
library(data.table)
DT <- as.data.table(hflights)
DT[Month==10,mean(na.omit(AirTime)), by=UniqueCarrier]Con la tecnología de
UniqueCarrier V1
AA 68.76471
AS 255.29032
B6 176.93548
CO 141.52861...Con la tecnología de
Aquí filtramos la tabla para quedarnos solo con las filas del mes 10, calculamos el tiempo medio en aire de los vuelos que realmente despegaron (por eso usamos na.omit(): los vuelos cancelados no tienen valor en AirTime) y agrupamos los resultados por aerolínea. Vemos, por ejemplo, que AA (American Airlines) tiene un AirTime medio mucho menor que AS (Alaska Airlines). ¿Te has fijado también en que puedes usar funciones base de R en la parte j? Llegaremos a eso enseguida.
La parte i
La parte ‘i’ se usa para filtrar filas, igual que en un data frame.
#selecciona de la segunda a la quinta fila de DT
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime AirTime
201112714011501 AA 428 N557AA 6045201113113521502 AA 428 N541AA 7048201114214031513 AA 428 N403AA 7039201115314051507 AA 428 N492AA 6244
ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
-91 IAH DFW 2246900-8-8 IAH DFW 2245170033 IAH DFW 22492200-35 IAH DFW 2249900Con la tecnología de
Pero también puedes usar nombres de columnas, ya que se evalúan en el ámbito de DT.
#Devuelve todas las filas donde la aerolínea es American Airlines
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime
201111614001500 AA 428 N576AA 60201112714011501 AA 428 N557AA 60201113113521502 AA 428 N541AA 70201114214031513 AA 428 N403AA 70201115314051507 AA 428 N492AA 62---20111227210211333 AA 2234 N3ETAA 13220111228310151329 AA 2234 N3FJAA 13420111229410231335 AA 2234 N3GSAA 13220111230510241334 AA 2234 N3BAAA 13020111231610241343 AA 2234 N3HNAA 139
AirTime ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
40-100 IAH DFW 2247130045-91 IAH DFW 224690048-8-8 IAH DFW 224517003933 IAH DFW 2249220044-35 IAH DFW 2249900---112-121 IAH MIA 96481200112-16-5 IAH MIA 96491300110-103 IAH MIA 964121000110-114 IAH MIA 96491100119-24 IAH MIA 96481200Con la tecnología de
Fíjate en que no necesitas coma para filtrar filas en una data table. En un data.frame, hacer DF[2:5] devolvería todas las filas de las columnas 2 a 5. En su lugar (como ya sabrás), debemos escribir DF[2:5,]. También ten en cuenta que DT[,2:5] no significa nada para data.table, como se explica en la primera pregunta de las FAQs del paquete.
Curioso y útil: al filtrar filas también puedes usar el símbolo .N en el comando DT[…], que representa el número de filas o la última fila. Puedes emplearlo para seleccionar la última fila o un desplazamiento desde ella.
#Devuelve la penúltima fila de DT
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime AirTime
20111262656812 WN 621 N727SW 7664
ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
-13-4 HOU TUL 4533900Con la tecnología de
La parte j
La parte ‘j’ se usa para seleccionar columnas y hacer cosas con ellas. Y cosas puede ser prácticamente cualquier cosa. Puedes usar todo tipo de funciones, lo que es una gran ventaja de data.table.
Observa que la parte ‘i’ está vacía y lo primero dentro de los corchetes es una coma. Puede resultar contraintuitivo al principio, pero solo indica que no filtramos filas: se seleccionan todas. En ‘j’ calculamos el retraso medio a la llegada de todos los vuelos. Parece que, de media, los vuelos del conjunto hflights llegan con más de 7 minutos de retraso. ¡Ténlo en cuenta para tu próximo vuelo!
Cuando seleccionas varias columnas y haces cosas con ellas en ‘j’, necesitas la notación ‘.()’. Esta notación es simplemente un alias de ‘list()’. Devuelve una data table, mientras que no usar ‘.()’ devuelve solo un vector, como se ve arriba.
Aquí tomamos DT, seleccionamos en ‘i’ todas las filas donde la aerolínea era AA, calculamos el retraso medio en salida y llegada, y representamos en ‘j’ la hora de salida frente al retraso en salida.
En resumen, la parte ‘j’ se usa para hacer cálculos sobre las columnas que especifiques ahí. Como las columnas de una data table se tratan como variables y las partes de ‘j’ se evalúan como expresiones, prácticamente puedes hacer cualquier cosa en ‘j’. Esto reduce significativamente tu tiempo de programación.
La parte by
La última sección de este tutorial de data.table se centra en la parte ‘by’. Se utiliza cuando queremos calcular la parte ‘j’ agrupando por una variable concreta (o alguna transformación de esa variable). Verás que la expresión de ‘j’ se repite para cada grupo de ‘by’. Su uso es sencillo: indica en el argumento ‘by’ la columna por la que quieres agrupar.
Aquí calculamos el retraso medio antes de la salida, pero agrupado por el aeropuerto de origen. Parece que los vuelos que salen de HOU tienen un retraso medio mayor que los que salen de IAH.
Igual que en ‘j’, puedes hacer muchas cosas en ‘by’. Puedes usar funciones en ‘by’ para que los resultados de las operaciones realizadas en ‘j’ se agrupen por algo que especifiques dentro del comando DT[…]. Usar funciones dentro de DT[…] hace que esa única línea sea muy potente. Del mismo modo, debes usar la notación ‘.()’ cuando agrupes por varias columnas.
DT[,.(Avg_DepDelay_byWeekdays = mean(na.omit(DepDelay))), by=.(Origin,Weekdays = DayOfWeek<6)]Con la tecnología de
Origin Weekdays Avg_DepDelay_byWeekdays
IAH FALSE8.286543
IAH TRUE8.492484
HOU FALSE10.965384
HOU TRUE13.433994Con la tecnología de
Aquí, primero calculamos el retraso medio antes de la salida de todos los vuelos (sin filtrado en ‘i’, así que se seleccionan todas las filas) y después lo agrupamos, primero por el origen y luego por día laborable. Weekdays es False en fin de semana. Parece que el retraso medio antes de la salida fue mayor cuando el vuelo partía de HOU que de IAH y, sorprendentemente, los retrasos fueron menores en fin de semana.
Juntándolo todo, un comando típico DT[i,j,by] quedaría así:
DT[UniqueCarrier=="DL", .(Avg_DepDelay =
mean(na.omit(DepDelay)),
Avg_ArrDelay = mean(na.omit(ArrDelay)),
Compensation = mean(na.omit(ArrDelay - DepDelay))), by = .(Origin, Weekdays = DayOfWeek&lt;6)]Con la tecnología de
Origin Weekdays Avg_DepDelay Avg_ArrDelay Compensation
IAH FALSE8.9797304.116751-4.825719
HOU FALSE7.1200002.656566-4.555556
IAH TRUE9.2709486.281941-2.836609
HOU TRUE11.63138710.406593-1.278388Con la tecnología de
Aquí, el subconjunto de vuelos operados por Delta Air Lines (seleccionado en ‘i’) se agrupó por origen y por Weekdays (en ‘by’). También se calculó el tiempo compensado en el aire (en ‘j’). Parece que en fin de semana, independientemente de si el vuelo salía de IAH o HOU, el tiempo compensado en el aire (volando más rápido) es mayor.
Hay mucho más que descubrir en el paquete data.table, pero esta entrada ha ilustrado el comando básico DT[i,j,by]. El curso de DataCamp recorre el paquete en detalle. Puedes hacer los ejercicios a tu ritmo desde el navegador con pistas y feedback, y revisar los vídeos y diapositivas tantas veces como quieras. Este enfoque interactivo te permite adquirir un conocimiento sólido y experiencia práctica con data.table. Pruébalo gratis. Echa un vistazo a la chuleta del paquete data.table en R de DataCamp.
Esperamos que, gracias a este tutorial de data.table en R, hayas entendido la sintaxis fundamental de data.table y estés listo para experimentar por tu cuenta. Si tienes dudas sobre el paquete, échales un vistazo a las preguntas aquí. Matt y Arun están muy activos. Una de las próximas entradas sobre data.table será más técnica y profundizará en todo lo que se puede hacer con este paquete. ¡Permanece atento!
Descubre cómo acceder a los datos de tu marco de datos con el subconjunto. Aprende a hacer subconjuntos utilizando paréntesis o la función subconjunto() de R.
Averigua cómo importar datos a R, incluidos archivos CSV, JSON, Excel, HTML, bases de datos, SAS, SPSS, Matlab y otros, utilizando los conocidos paquetes de R.
Este tutorial de data.table en R explica los fundamentos del comando
DT[i, j, by], que es el núcleo del paquete data.table. Si quieres profundizar en el paquete, DataCamp ofrece un curso interactivo de R sobre el paquete data.table. El curso incluye más de 35 ejercicios interactivos de R —todo desde tu navegador— y varios vídeos con Matt Dowle, autor principal del paquete data.table, y Arun Srinivasan, uno de sus principales contribuidores. Pruébalo gratis.Si ya has trabajado con conjuntos de datos grandes en RAM (de 1 a más de 100 GB), sabrás que un
data.framepuede quedarse corto: hay operaciones que tardan demasiado. Data.table resuelve este problema reduciendo los tiempos de cómputo. Además, te permite hacer más con menos tecleo. Una vez domines la sintaxis de data.table con este tutorial, te sorprenderá lo sencillo que es realizar operaciones complejas. Así que no solo reducirás el tiempo de cómputo, sino también el tiempo de programación.El comando
DT[i,j,by]tiene tres partes:i,jyby. Si piensas en términos de SQL,iequivale a WHERE,ja SELECT ybya GROUP BY. Solemos describir el comando así: “Toma DT, selecciona filas con ‘i’, luego calcula ‘j’ agrupando por ‘by’”. Con un ejemplo sencillo y usando el conjunto de datoshflights(para que puedas reproducirlo), quedaría así:Aquí filtramos la tabla para quedarnos solo con las filas del mes 10, calculamos el tiempo medio en aire de los vuelos que realmente despegaron (por eso usamos
na.omit(): los vuelos cancelados no tienen valor en AirTime) y agrupamos los resultados por aerolínea. Vemos, por ejemplo, que AA (American Airlines) tiene un AirTime medio mucho menor que AS (Alaska Airlines). ¿Te has fijado también en que puedes usar funciones base de R en la partej? Llegaremos a eso enseguida.La parte i
La parte ‘i’ se usa para filtrar filas, igual que en un data frame.
Pero también puedes usar nombres de columnas, ya que se evalúan en el ámbito de DT.
Fíjate en que no necesitas coma para filtrar filas en una data table. En un data.frame, hacer
DF[2:5]devolvería todas las filas de las columnas 2 a 5. En su lugar (como ya sabrás), debemos escribirDF[2:5,]. También ten en cuenta queDT[,2:5]no significa nada para data.table, como se explica en la primera pregunta de las FAQs del paquete.Curioso y útil: al filtrar filas también puedes usar el símbolo
.Nen el comando DT[…], que representa el número de filas o la última fila. Puedes emplearlo para seleccionar la última fila o un desplazamiento desde ella.La parte j
La parte ‘j’ se usa para seleccionar columnas y hacer cosas con ellas. Y cosas puede ser prácticamente cualquier cosa. Puedes usar todo tipo de funciones, lo que es una gran ventaja de data.table.
Observa que la parte ‘i’ está vacía y lo primero dentro de los corchetes es una coma. Puede resultar contraintuitivo al principio, pero solo indica que no filtramos filas: se seleccionan todas. En ‘j’ calculamos el retraso medio a la llegada de todos los vuelos. Parece que, de media, los vuelos del conjunto hflights llegan con más de 7 minutos de retraso. ¡Ténlo en cuenta para tu próximo vuelo!
Cuando seleccionas varias columnas y haces cosas con ellas en ‘j’, necesitas la notación ‘
.()’. Esta notación es simplemente un alias de ‘list()’. Devuelve una data table, mientras que no usar ‘.()’ devuelve solo un vector, como se ve arriba.Otra función útil que requiere la notación ‘
.()’ te permite renombrar columnas dentro del propio comando DT[…].Por supuesto, no es obligatorio poner nombres nuevos.
Combinando lo anterior sobre ‘i’ y ‘j’ obtenemos:
Aquí tomamos DT, seleccionamos en ‘i’ todas las filas donde la aerolínea era AA, calculamos el retraso medio en salida y llegada, y representamos en ‘j’ la hora de salida frente al retraso en salida.
En resumen, la parte ‘j’ se usa para hacer cálculos sobre las columnas que especifiques ahí. Como las columnas de una data table se tratan como variables y las partes de ‘j’ se evalúan como expresiones, prácticamente puedes hacer cualquier cosa en ‘j’. Esto reduce significativamente tu tiempo de programación.
La parte by
La última sección de este tutorial de data.table se centra en la parte ‘by’. Se utiliza cuando queremos calcular la parte ‘j’ agrupando por una variable concreta (o alguna transformación de esa variable). Verás que la expresión de ‘j’ se repite para cada grupo de ‘by’. Su uso es sencillo: indica en el argumento ‘by’ la columna por la que quieres agrupar.
Aquí calculamos el retraso medio antes de la salida, pero agrupado por el aeropuerto de origen. Parece que los vuelos que salen de HOU tienen un retraso medio mayor que los que salen de IAH.
Igual que en ‘j’, puedes hacer muchas cosas en ‘by’. Puedes usar funciones en ‘by’ para que los resultados de las operaciones realizadas en ‘j’ se agrupen por algo que especifiques dentro del comando
DT[…]. Usar funciones dentro deDT[…]hace que esa única línea sea muy potente. Del mismo modo, debes usar la notación ‘.()’ cuando agrupes por varias columnas.Aquí, primero calculamos el retraso medio antes de la salida de todos los vuelos (sin filtrado en ‘i’, así que se seleccionan todas las filas) y después lo agrupamos, primero por el origen y luego por día laborable. Weekdays es
Falseen fin de semana. Parece que el retraso medio antes de la salida fue mayor cuando el vuelo partía de HOU que de IAH y, sorprendentemente, los retrasos fueron menores en fin de semana.Juntándolo todo, un comando típico
DT[i,j,by]quedaría así:Aquí, el subconjunto de vuelos operados por Delta Air Lines (seleccionado en ‘i’) se agrupó por origen y por Weekdays (en ‘by’). También se calculó el tiempo compensado en el aire (en ‘j’). Parece que en fin de semana, independientemente de si el vuelo salía de IAH o HOU, el tiempo compensado en el aire (volando más rápido) es mayor.
Hay mucho más que descubrir en el paquete data.table, pero esta entrada ha ilustrado el comando básico
DT[i,j,by]. El curso de DataCamp recorre el paquete en detalle. Puedes hacer los ejercicios a tu ritmo desde el navegador con pistas y feedback, y revisar los vídeos y diapositivas tantas veces como quieras. Este enfoque interactivo te permite adquirir un conocimiento sólido y experiencia práctica con data.table. Pruébalo gratis. Echa un vistazo a la chuleta del paquete data.table en R de DataCamp.Esperamos que, gracias a este tutorial de data.table en R, hayas entendido la sintaxis fundamental de data.table y estés listo para experimentar por tu cuenta. Si tienes dudas sobre el paquete, échales un vistazo a las preguntas aquí. Matt y Arun están muy activos. Una de las próximas entradas sobre data.table será más técnica y profundizará en todo lo que se puede hacer con este paquete. ¡Permanece atento!