Contexto

El paquete nycflights13 contiene información sobre todos los vuelos que partieron desde Nueva York (EWR, JFK, LGA) a destinos en los Estados Unidos en 2013. Fueron 336,776 vuelos en total. Para ayudar a comprender las causas de los retrasos, también incluyen otros conjuntos de datos útiles.

Este paquete incluye las siguientes tablas:

  • Flights = todos los vuelos que salieron de Nueva York en 2013
  • Weather = datos meteorológicos por hora de cada aeropuerto
  • Planes = información de contrucción de cada avión
  • Airports = nombres y ubicaciones de aeropuertos
  • Airlines = relación entre nombres y códigos de las aerolíneas

Fuente: Origen de los datos

Instalar Paquetes y Llamar Librerías

# install.packages("nycflights13")
library("nycflights13")
# install.packages("stats")
library("stats")
# install.packages("tidyverse")
library("tidyverse")
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# install.packages("dplyr")
library("dplyr")

Guardar Bases de Datos

flights <- flights
weather <- weather
planes <- planes
airports <- airports
airlines <- airlines

Relación entre las bases de datos

Funciones Básicas de Manejo de Datos

Select

La función select sirve para seleccionar columnas de una tabla (data frame)

df1 <- flights %>% select(carrier, flight) #slección de columnas específficas 
df2 <- flights %>% select(carrier:distance) #seleccion de rango
df3 <- flights %>% select(-carrier, -flight) #eliminar columnas
df4 <- flights %>% select(-carrier:-distance) #eliminar rango de columnas 
df5 <- flights %>% select(aerolinea = carrier) #selecciona una columna y le cambia el nombre
df6 <- flights %>% rename(aerolinea = carrier) #cambiar nombre a una columana

Filter

La función filter sirve para seleccionar renglones de una tabla (data frame)

df7 <- flights %>% filter(dep_delay >= 500) #extrae renglones que cumplan condición
# Condiciones:
# igual ==, 
# desigual =!= 
# mayor que > 
# mayor o igual que >= 
# menor que <
# menor o igua que <=

# Operadores lógicos:
# AND &
# OR |
# NOT !
  
df8 <- flights %>% filter(dep_delay >= 500, dep_delay < 600) #extrae renglones que cumplan con dos condiciones
df9 <- flights %>% slice(1000:1099) #extare los numeros de los renglones indicados, sin importar sus valores 

Distinct

La función distinct sirve para eliminar renglones duplicados.

df10 <- distinct(flights) #dejar sólo los renglones diferentes, borra todos los repetidos

Merge

La función merge sirve para juntar bases de datos.

bdgrande <- merge(flights, airlines, by="carrier") 
bdgrande2 <- merge(bdgrande, planes, by="tailnum") 

Mutate

bdgrande3 <- mutate(bdgrande2, dist_km = distance*1.609) #agregar columnas con las existentes

Ejercicios

  1. Encuentra todos los vuelos que tuvieron un atraso en llegada de 2 horas o más.
ejercicio1 <- bdgrande2 %>% filter(arr_delay>=120)
  1. Encuentra todos los vuelos que llegaron a Houston (IAH o HOU)
ejercicio2 <- bdgrande2 %>% filter(dest == "IAH" | dest == "HOU")
  1. Encuentra todos los vuelos operados por United, American o Delta
ejercicio3 <- bdgrande2 %>% filter(carrier %in% c("UA", "AA", "DL"))
  1. Encuentra todos los vuelos que despegaron en Julio, Agosto o Septiembre
ejercicio4a <- bdgrande2 %>% filter(month == 7 | month == 8 | month == 9)
ejercicio4b <- bdgrande2 %>% filter(carrier %in% c(7:9))
  1. Encuentra todos los vuelos que arrivaron más de 2 horas tarde, pero no despegaron tarde
ejercicio5a <- bdgrande2 %>% filter(arr_delay>120 & dep_time == sched_dep_time)
ejercicio5b <- bdgrande2 %>% filter(arr_delay>120 & dep_delay <= 0)
  1. Encuentra todos los vuelos que se retrasaron al menos 1 hora, pero que llegaron antes 30 minutos o más.
ejercicio6 <- bdgrande2 %>% filter(dep_delay>=60 & arr_delay<=-30)
  1. Encuentra todos los vuelos que salieron entre la medianoche y las 6 a.m. (inclusive)
ejercicio7 <- bdgrande2 %>% filter(dep_time==2400 | dep_time<=600)

Arrange

Similar a filter() pero en lugar de seleccionar renglones, los ordena de menor a mayor.

df11 <- arrange(bdgrande2, year.x, month, day,)

Para acomodar de mayor a menor.

df12 <- arrange(bdgrande2, year.x,desc(month),day,)

Summarize

Colapsa una tabla a un sólo renglón.

# Obtén el retraso promedio de despegue de todos los vuelos
summarize(bdgrande2, mean(dep_delay, na.rm=TRUE))
##   mean(dep_delay, na.rm = TRUE)
## 1                      13.17979

Group by

Agrupa tabla basado en algunas columnas.

# Obtener el retraso promedio de despegue por día
por_dia <- group_by(bdgrande2, year.x, month, day)
summarize(por_dia, mean(dep_delay, na.rm=TRUE))
## `summarise()` has grouped output by 'year.x', 'month'. You can override using
## the `.groups` argument.
## # A tibble: 365 × 4
## # Groups:   year.x, month [12]
##    year.x month   day `mean(dep_delay, na.rm = TRUE)`
##     <int> <int> <int>                           <dbl>
##  1   2013     1     1                           10.7 
##  2   2013     1     2                           14.4 
##  3   2013     1     3                           11.1 
##  4   2013     1     4                           10.0 
##  5   2013     1     5                            5.70
##  6   2013     1     6                            7.98
##  7   2013     1     7                            6.49
##  8   2013     1     8                            3.10
##  9   2013     1     9                            3.17
## 10   2013     1    10                            1.89
## # ℹ 355 more rows
LS0tCnRpdGxlOiAiRGF0YSBXcmFuZ2xpbmcgKFBhcnRlIDEpIgphdXRob3I6ICJEaWVnbyBTZXJuYSAtIEEwMTI4NTQ5MCIKZGF0ZTogIjIwMjQtMDItMTkiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogeWV0aQotLS0KCiFbXSgvVXNlcnMvZGllZ29zZXJuYS9EZXNrdG9wL1RlYyBTbWVzdHJlcyAvNHRvIFNlbWVzdHJlL01hbmlwdWxhY2lvzIFuIGRlIERhdG9zL0ZvdG9zIFIgc3R1ZGlvL05ld195b3JrX3RpbWVzX3NxdWFyZS10ZXJhYmFzcy5wbmcpCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPkNvbnRleHRvPC9zcGFuPgpFbCBwYXF1ZXRlICoqbnljZmxpZ2h0czEzKiogY29udGllbmUgaW5mb3JtYWNpw7NuIHNvYnJlIHRvZG9zIGxvcyB2dWVsb3MgcXVlIHBhcnRpZXJvbiBkZXNkZSBOdWV2YSBZb3JrIChFV1IsIEpGSywgTEdBKSBhIGRlc3Rpbm9zIGVuIGxvcyBFc3RhZG9zIFVuaWRvcyBlbiAyMDEzLiBGdWVyb24gMzM2LDc3NiB2dWVsb3MgZW4gdG90YWwuIFBhcmEgYXl1ZGFyIGEgY29tcHJlbmRlciBsYXMgY2F1c2FzIGRlIGxvcyByZXRyYXNvcywgdGFtYmnDqW4gaW5jbHV5ZW4gb3Ryb3MgY29uanVudG9zIGRlIGRhdG9zIMO6dGlsZXMuICAKCkVzdGUgcGFxdWV0ZSBpbmNsdXllIGxhcyBzaWd1aWVudGVzIHRhYmxhczogIAoKKyBGbGlnaHRzID0gdG9kb3MgbG9zIHZ1ZWxvcyBxdWUgc2FsaWVyb24gZGUgTnVldmEgWW9yayBlbiAyMDEzIAorIFdlYXRoZXIgPSBkYXRvcyBtZXRlb3JvbMOzZ2ljb3MgcG9yIGhvcmEgZGUgY2FkYSBhZXJvcHVlcnRvIAorIFBsYW5lcyA9IGluZm9ybWFjacOzbiBkZSBjb250cnVjY2nDs24gZGUgY2FkYSBhdmnDs24gCisgQWlycG9ydHMgPSBub21icmVzIHkgdWJpY2FjaW9uZXMgZGUgYWVyb3B1ZXJ0b3MgCisgQWlybGluZXMgPSByZWxhY2nDs24gZW50cmUgbm9tYnJlcyB5IGPDs2RpZ29zIGRlIGxhcyBhZXJvbMOtbmVhcwoKRnVlbnRlOgpbT3JpZ2VuIGRlIGxvcyBkYXRvc10oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL255Y2ZsaWdodHMxMy9ueWNmbGlnaHRzMTMucGRmKQoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5JbnN0YWxhciBQYXF1ZXRlcyB5IExsYW1hciBMaWJyZXLDrWFzPC9zcGFuPgpgYGB7cn0KIyBpbnN0YWxsLnBhY2thZ2VzKCJueWNmbGlnaHRzMTMiKQpsaWJyYXJ5KCJueWNmbGlnaHRzMTMiKQojIGluc3RhbGwucGFja2FnZXMoInN0YXRzIikKbGlicmFyeSgic3RhdHMiKQojIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCmxpYnJhcnkoInRpZHl2ZXJzZSIpCiMgaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQpsaWJyYXJ5KCJkcGx5ciIpCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5HdWFyZGFyIEJhc2VzIGRlIERhdG9zPC9zcGFuPgpgYGB7cn0KZmxpZ2h0cyA8LSBmbGlnaHRzCndlYXRoZXIgPC0gd2VhdGhlcgpwbGFuZXMgPC0gcGxhbmVzCmFpcnBvcnRzIDwtIGFpcnBvcnRzCmFpcmxpbmVzIDwtIGFpcmxpbmVzCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5SZWxhY2nDs24gZW50cmUgbGFzIGJhc2VzIGRlIGRhdG9zPC9zcGFuPgohW10oL1VzZXJzL2RpZWdvc2VybmEvRGVza3RvcC9UZWMgU21lc3RyZXMgLzR0byBTZW1lc3RyZS9NYW5pcHVsYWNpb8yBbiBkZSBEYXRvcy9Gb3RvcyBSIHN0dWRpby9yZWxhdGlvbmFsLW55Y2ZsaWdodHMucG5nKQoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5GdW5jaW9uZXMgQsOhc2ljYXMgZGUgTWFuZWpvIGRlIERhdG9zPC9zcGFuPgoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+U2VsZWN0PC9zcGFuPgpMYSBmdW5jacOzbiAqc2VsZWN0KiBzaXJ2ZSBwYXJhIHNlbGVjY2lvbmFyIGNvbHVtbmFzIGRlIHVuYSB0YWJsYSAoKmRhdGEgZnJhbWUqKQpgYGB7cn0KZGYxIDwtIGZsaWdodHMgJT4lIHNlbGVjdChjYXJyaWVyLCBmbGlnaHQpICNzbGVjY2nDs24gZGUgY29sdW1uYXMgZXNwZWPDrWZmaWNhcyAKZGYyIDwtIGZsaWdodHMgJT4lIHNlbGVjdChjYXJyaWVyOmRpc3RhbmNlKSAjc2VsZWNjaW9uIGRlIHJhbmdvCmRmMyA8LSBmbGlnaHRzICU+JSBzZWxlY3QoLWNhcnJpZXIsIC1mbGlnaHQpICNlbGltaW5hciBjb2x1bW5hcwpkZjQgPC0gZmxpZ2h0cyAlPiUgc2VsZWN0KC1jYXJyaWVyOi1kaXN0YW5jZSkgI2VsaW1pbmFyIHJhbmdvIGRlIGNvbHVtbmFzIApkZjUgPC0gZmxpZ2h0cyAlPiUgc2VsZWN0KGFlcm9saW5lYSA9IGNhcnJpZXIpICNzZWxlY2Npb25hIHVuYSBjb2x1bW5hIHkgbGUgY2FtYmlhIGVsIG5vbWJyZQpkZjYgPC0gZmxpZ2h0cyAlPiUgcmVuYW1lKGFlcm9saW5lYSA9IGNhcnJpZXIpICNjYW1iaWFyIG5vbWJyZSBhIHVuYSBjb2x1bWFuYQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPkZpbHRlcjwvc3Bhbj4KTGEgZnVuY2nDs24gKmZpbHRlciogc2lydmUgcGFyYSBzZWxlY2Npb25hciByZW5nbG9uZXMgZGUgdW5hIHRhYmxhICgqZGF0YSBmcmFtZSopCmBgYHtyfQpkZjcgPC0gZmxpZ2h0cyAlPiUgZmlsdGVyKGRlcF9kZWxheSA+PSA1MDApICNleHRyYWUgcmVuZ2xvbmVzIHF1ZSBjdW1wbGFuIGNvbmRpY2nDs24KIyBDb25kaWNpb25lczoKIyBpZ3VhbCA9PSwgCiMgZGVzaWd1YWwgPSE9IAojIG1heW9yIHF1ZSA+IAojIG1heW9yIG8gaWd1YWwgcXVlID49IAojIG1lbm9yIHF1ZSA8CiMgbWVub3IgbyBpZ3VhIHF1ZSA8PQoKIyBPcGVyYWRvcmVzIGzDs2dpY29zOgojIEFORCAmCiMgT1IgfAojIE5PVCAhCiAgCmRmOCA8LSBmbGlnaHRzICU+JSBmaWx0ZXIoZGVwX2RlbGF5ID49IDUwMCwgZGVwX2RlbGF5IDwgNjAwKSAjZXh0cmFlIHJlbmdsb25lcyBxdWUgY3VtcGxhbiBjb24gZG9zIGNvbmRpY2lvbmVzCmRmOSA8LSBmbGlnaHRzICU+JSBzbGljZSgxMDAwOjEwOTkpICNleHRhcmUgbG9zIG51bWVyb3MgZGUgbG9zIHJlbmdsb25lcyBpbmRpY2Fkb3MsIHNpbiBpbXBvcnRhciBzdXMgdmFsb3JlcyAKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5EaXN0aW5jdDwvc3Bhbj4KTGEgZnVuY2nDs24gKmRpc3RpbmN0KiBzaXJ2ZSBwYXJhIGVsaW1pbmFyIHJlbmdsb25lcyBkdXBsaWNhZG9zLgpgYGB7cn0KZGYxMCA8LSBkaXN0aW5jdChmbGlnaHRzKSAjZGVqYXIgc8OzbG8gbG9zIHJlbmdsb25lcyBkaWZlcmVudGVzLCBib3JyYSB0b2RvcyBsb3MgcmVwZXRpZG9zCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+TWVyZ2U8L3NwYW4+CkxhIGZ1bmNpw7NuICptZXJnZSogc2lydmUgcGFyYSBqdW50YXIgYmFzZXMgZGUgZGF0b3MuIApgYGB7cn0KYmRncmFuZGUgPC0gbWVyZ2UoZmxpZ2h0cywgYWlybGluZXMsIGJ5PSJjYXJyaWVyIikgCmJkZ3JhbmRlMiA8LSBtZXJnZShiZGdyYW5kZSwgcGxhbmVzLCBieT0idGFpbG51bSIpIApgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPk11dGF0ZTwvc3Bhbj4KYGBge3J9CmJkZ3JhbmRlMyA8LSBtdXRhdGUoYmRncmFuZGUyLCBkaXN0X2ttID0gZGlzdGFuY2UqMS42MDkpICNhZ3JlZ2FyIGNvbHVtbmFzIGNvbiBsYXMgZXhpc3RlbnRlcwpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPkVqZXJjaWNpb3M8L3NwYW4+CjEuIEVuY3VlbnRyYSB0b2RvcyBsb3MgdnVlbG9zIHF1ZSB0dXZpZXJvbiB1biBhdHJhc28gZW4gbGxlZ2FkYSBkZSAyIGhvcmFzIG8gbcOhcy4KYGBge3J9CmVqZXJjaWNpbzEgPC0gYmRncmFuZGUyICU+JSBmaWx0ZXIoYXJyX2RlbGF5Pj0xMjApCmBgYAoKMi4gRW5jdWVudHJhIHRvZG9zIGxvcyB2dWVsb3MgcXVlIGxsZWdhcm9uIGEgSG91c3RvbiAoSUFIIG8gSE9VKQpgYGB7cn0KZWplcmNpY2lvMiA8LSBiZGdyYW5kZTIgJT4lIGZpbHRlcihkZXN0ID09ICJJQUgiIHwgZGVzdCA9PSAiSE9VIikKYGBgCgozLiBFbmN1ZW50cmEgdG9kb3MgbG9zIHZ1ZWxvcyBvcGVyYWRvcyBwb3IgVW5pdGVkLCBBbWVyaWNhbiBvIERlbHRhCmBgYHtyfQplamVyY2ljaW8zIDwtIGJkZ3JhbmRlMiAlPiUgZmlsdGVyKGNhcnJpZXIgJWluJSBjKCJVQSIsICJBQSIsICJETCIpKQpgYGAKCjQuIEVuY3VlbnRyYSB0b2RvcyBsb3MgdnVlbG9zIHF1ZSBkZXNwZWdhcm9uIGVuIEp1bGlvLCBBZ29zdG8gbyBTZXB0aWVtYnJlIApgYGB7cn0KZWplcmNpY2lvNGEgPC0gYmRncmFuZGUyICU+JSBmaWx0ZXIobW9udGggPT0gNyB8IG1vbnRoID09IDggfCBtb250aCA9PSA5KQplamVyY2ljaW80YiA8LSBiZGdyYW5kZTIgJT4lIGZpbHRlcihjYXJyaWVyICVpbiUgYyg3OjkpKQpgYGAKCjUuIEVuY3VlbnRyYSB0b2RvcyBsb3MgdnVlbG9zIHF1ZSBhcnJpdmFyb24gbcOhcyBkZSAyIGhvcmFzIHRhcmRlLCBwZXJvIG5vIGRlc3BlZ2Fyb24gdGFyZGUKYGBge3J9CmVqZXJjaWNpbzVhIDwtIGJkZ3JhbmRlMiAlPiUgZmlsdGVyKGFycl9kZWxheT4xMjAgJiBkZXBfdGltZSA9PSBzY2hlZF9kZXBfdGltZSkKZWplcmNpY2lvNWIgPC0gYmRncmFuZGUyICU+JSBmaWx0ZXIoYXJyX2RlbGF5PjEyMCAmIGRlcF9kZWxheSA8PSAwKQpgYGAKCjYuIEVuY3VlbnRyYSB0b2RvcyBsb3MgdnVlbG9zIHF1ZSBzZSByZXRyYXNhcm9uIGFsIG1lbm9zIDEgaG9yYSwgcGVybyBxdWUgbGxlZ2Fyb24gYW50ZXMgMzAgbWludXRvcyBvIG3DoXMuCmBgYHtyfQplamVyY2ljaW82IDwtIGJkZ3JhbmRlMiAlPiUgZmlsdGVyKGRlcF9kZWxheT49NjAgJiBhcnJfZGVsYXk8PS0zMCkKYGBgCgo3LiBFbmN1ZW50cmEgdG9kb3MgbG9zIHZ1ZWxvcyBxdWUgc2FsaWVyb24gZW50cmUgbGEgbWVkaWFub2NoZSB5IGxhcyA2IGEubS4gKGluY2x1c2l2ZSkKYGBge3J9CmVqZXJjaWNpbzcgPC0gYmRncmFuZGUyICU+JSBmaWx0ZXIoZGVwX3RpbWU9PTI0MDAgfCBkZXBfdGltZTw9NjAwKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPkFycmFuZ2U8L3NwYW4+ClNpbWlsYXIgYSBmaWx0ZXIoKSBwZXJvIGVuIGx1Z2FyIGRlIHNlbGVjY2lvbmFyIHJlbmdsb25lcywgbG9zIG9yZGVuYSBkZSBtZW5vciBhIG1heW9yLiAKYGBge3J9CmRmMTEgPC0gYXJyYW5nZShiZGdyYW5kZTIsIHllYXIueCwgbW9udGgsIGRheSwpCmBgYAoKUGFyYSBhY29tb2RhciBkZSBtYXlvciBhIG1lbm9yLgpgYGB7cn0KZGYxMiA8LSBhcnJhbmdlKGJkZ3JhbmRlMiwgeWVhci54LGRlc2MobW9udGgpLGRheSwpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+U3VtbWFyaXplPC9zcGFuPgpDb2xhcHNhIHVuYSB0YWJsYSBhIHVuIHPDs2xvIHJlbmdsw7NuLgpgYGB7cn0KIyBPYnTDqW4gZWwgcmV0cmFzbyBwcm9tZWRpbyBkZSBkZXNwZWd1ZSBkZSB0b2RvcyBsb3MgdnVlbG9zCnN1bW1hcml6ZShiZGdyYW5kZTIsIG1lYW4oZGVwX2RlbGF5LCBuYS5ybT1UUlVFKSkKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5Hcm91cCBieTwvc3Bhbj4KQWdydXBhIHRhYmxhIGJhc2FkbyBlbiBhbGd1bmFzIGNvbHVtbmFzLgpgYGB7cn0KIyBPYnRlbmVyIGVsIHJldHJhc28gcHJvbWVkaW8gZGUgZGVzcGVndWUgcG9yIGTDrWEKcG9yX2RpYSA8LSBncm91cF9ieShiZGdyYW5kZTIsIHllYXIueCwgbW9udGgsIGRheSkKc3VtbWFyaXplKHBvcl9kaWEsIG1lYW4oZGVwX2RlbGF5LCBuYS5ybT1UUlVFKSkKYGBgCgo=