Siguiendo las instrucciones de https://r4ds.had.co.nz/transform.html repasamos las nociones de transformación de datos mediante el paquete dplyr
Para visualizar los resultados usaremos los paquetes vuelos y ggplot2
library(tidyverse)
library(lubridate)
Desde el paquete “datos” podemos obtener datos de vuelos en español y trabajar con los mismos.
library(datos)
## Warning: package 'datos' was built under R version 4.3.2
vuelos_es <- datos::vuelos
Repaso de funciones más usadas
dia1 <- filter(vuelos_es, mes==1, dia==1)
1. Vuelos sin retraso por mas de dos horas.
sin_retraso2 <- filter(vuelos_es,
atraso_salida <= 120, atraso_llegada <= 120)
2. Si queremos ver si hay valores faltantes is.na() por ejemplo en la variable día
#is.na(vuelos_es)
todos_menosna <- filter(vuelos_es, is.na(dia) | dia >=1)
3. Vuelos que volaron a Houston (IAH or HOU)
houston <- vuelos_es %>% filter(destino== "HOU" | destino == "IAH")
4. Vuelos operados por United, American o Delta.
operados_por <- vuelos_es %>% filter(aerolinea== “UA” | #aerolinea==“DL”)
operados_por <- filter(vuelos_es %in% c(“UA”, “DL”))
5.Vuelos que salen en los meses de verano ( enero, febrero, marzo) Nueva variable estación
verano <- filter(vuelos_es, mes %in% c(1,2,3))
estaciones <- vuelos_es %>%
mutate(estacion = case_when(
lubridate::month(mes) %in% c(12, 1, 2) ~ "Invierno",
lubridate::month(mes) %in% c(3, 4, 5) ~ "Primavera",
lubridate::month(mes) %in% c(6, 7, 8) ~ "Verano",
lubridate::month(mes) %in% c(9, 10, 11) ~ "Otoño"
))
6. Vuelos que se hayan demorado al menos una hora, pero que en el aire, en vuelo hayan estado más de 30 minutos.
demorados <- vuelos_es %>%
filter(atraso_salida >=60,
tiempo_vuelo>30)
(demo_masuno <- filter(vuelos_es, tiempo_vuelo >= 30, atraso_salida >=60))
## # A tibble: 26,681 × 19
## anio mes dia horario_salida salida_programada atraso_salida
## <int> <int> <int> <int> <int> <dbl>
## 1 2013 1 1 811 630 101
## 2 2013 1 1 826 715 71
## 3 2013 1 1 848 1835 853
## 4 2013 1 1 957 733 144
## 5 2013 1 1 1114 900 134
## 6 2013 1 1 1120 944 96
## 7 2013 1 1 1301 1150 71
## 8 2013 1 1 1337 1220 77
## 9 2013 1 1 1400 1250 70
## 10 2013 1 1 1505 1310 115
## # ℹ 26,671 more rows
## # ℹ 13 more variables: horario_llegada <int>, llegada_programada <int>,
## # atraso_llegada <dbl>, aerolinea <chr>, vuelo <int>, codigo_cola <chr>,
## # origen <chr>, destino <chr>, tiempo_vuelo <dbl>, distancia <dbl>,
## # hora <dbl>, minuto <dbl>, fecha_hora <dttm>
7. Vuelos que salgan entre la medianoche y las 6 de la mañana (inclusive)
madrugada <- vuelos_es %>%
filter(salida_programada >=12,
salida_programada <= 6)
(vuelos_madrugada <- filter(vuelos_es, salida_programada %in% c(0.00:6.00) ))
## # A tibble: 0 × 19
## # ℹ 19 variables: anio <int>, mes <int>, dia <int>, horario_salida <int>,
## # salida_programada <int>, atraso_salida <dbl>, horario_llegada <int>,
## # llegada_programada <int>, atraso_llegada <dbl>, aerolinea <chr>,
## # vuelo <int>, codigo_cola <chr>, origen <chr>, destino <chr>,
## # tiempo_vuelo <dbl>, distancia <dbl>, hora <dbl>, minuto <dbl>,
## # fecha_hora <dttm>
- Resolver:
noa_tiempo <- vuelos_es %>%
mutate (dif = horario_salida - salida_programada)
noa_tiempo <- noa_tiempo %>%
relocate (atraso_salida:fecha_hora, .after= dif)
con_atraso <- noa_tiempo %>%
filter(dif >=1)
Recordar que acomoda el orden de las filas. orden by.
anio <- arrange(vuelos_es, anio, mes, dia)
# descendiente
arrange(vuelos_es, desc(atraso_salida))
## # A tibble: 336,776 × 19
## anio mes dia horario_salida salida_programada atraso_salida
## <int> <int> <int> <int> <int> <dbl>
## 1 2013 1 9 641 900 1301
## 2 2013 6 15 1432 1935 1137
## 3 2013 1 10 1121 1635 1126
## 4 2013 9 20 1139 1845 1014
## 5 2013 7 22 845 1600 1005
## 6 2013 4 10 1100 1900 960
## 7 2013 3 17 2321 810 911
## 8 2013 6 27 959 1900 899
## 9 2013 7 22 2257 759 898
## 10 2013 12 5 756 1700 896
## # ℹ 336,766 more rows
## # ℹ 13 more variables: horario_llegada <int>, llegada_programada <int>,
## # atraso_llegada <dbl>, aerolinea <chr>, vuelo <int>, codigo_cola <chr>,
## # origen <chr>, destino <chr>, tiempo_vuelo <dbl>, distancia <dbl>,
## # hora <dbl>, minuto <dbl>, fecha_hora <dttm>
vuelos <-vuelos_es %>%
mutate (salidas_t = horario_salida / 100) %>%
select(salidas_t, horario_salida, everything()) %>%
mutate (salida_prog = salida_programada / 100) %>%
select(salida_prog, salida_programada, everything())
vuelos <- vuelos_es %>%
mutate(partidas_t = horario_salida / 100) %>%
select(partidas_t, horario_salida, everything()) %>%
mutate (calend_t = salida_programada / 100) %>%
select(calend_t, salida_programada, everything())
na <- arrange(vuelos_es, desc(is.na(vuelos_es)))
na
## # A tibble: 336,776 × 19
## anio mes dia horario_salida salida_programada atraso_salida
## <int> <int> <int> <int> <int> <dbl>
## 1 2013 1 2 NA 1545 NA
## 2 2013 1 2 NA 1601 NA
## 3 2013 1 3 NA 857 NA
## 4 2013 1 3 NA 645 NA
## 5 2013 1 4 NA 845 NA
## 6 2013 1 4 NA 1830 NA
## 7 2013 1 5 NA 840 NA
## 8 2013 1 7 NA 820 NA
## 9 2013 1 8 NA 1645 NA
## 10 2013 1 9 NA 755 NA
## # ℹ 336,766 more rows
## # ℹ 13 more variables: horario_llegada <int>, llegada_programada <int>,
## # atraso_llegada <dbl>, aerolinea <chr>, vuelo <int>, codigo_cola <chr>,
## # origen <chr>, destino <chr>, tiempo_vuelo <dbl>, distancia <dbl>,
## # hora <dbl>, minuto <dbl>, fecha_hora <dttm>
2. Vuelo más demorado. Y vuelo que sale más temprano
v_demorado <- arrange(vuelos_es, desc(horario_salida))
v_temprano <- arrange(vuelos_es, horario_salida)
v_rapidos <- arrange(vuelos_es, atraso_salida)
select(vuelos_es, anio, mes, dia)
## # A tibble: 336,776 × 3
## anio mes dia
## <int> <int> <int>
## 1 2013 1 1
## 2 2013 1 1
## 3 2013 1 1
## 4 2013 1 1
## 5 2013 1 1
## 6 2013 1 1
## 7 2013 1 1
## 8 2013 1 1
## 9 2013 1 1
## 10 2013 1 1
## # ℹ 336,766 more rows
# todas las columnas entre año y día
select(vuelos_es, anio:dia)
## # A tibble: 336,776 × 3
## anio mes dia
## <int> <int> <int>
## 1 2013 1 1
## 2 2013 1 1
## 3 2013 1 1
## 4 2013 1 1
## 5 2013 1 1
## 6 2013 1 1
## 7 2013 1 1
## 8 2013 1 1
## 9 2013 1 1
## 10 2013 1 1
## # ℹ 336,766 more rows
# exceptuando
select(vuelos_es, -(anio:dia))
## # A tibble: 336,776 × 16
## horario_salida salida_programada atraso_salida horario_llegada
## <int> <int> <dbl> <int>
## 1 517 515 2 830
## 2 533 529 4 850
## 3 542 540 2 923
## 4 544 545 -1 1004
## 5 554 600 -6 812
## 6 554 558 -4 740
## 7 555 600 -5 913
## 8 557 600 -3 709
## 9 557 600 -3 838
## 10 558 600 -2 753
## # ℹ 336,766 more rows
## # ℹ 12 more variables: llegada_programada <int>, atraso_llegada <dbl>,
## # aerolinea <chr>, vuelo <int>, codigo_cola <chr>, origen <chr>,
## # destino <chr>, tiempo_vuelo <dbl>, distancia <dbl>, hora <dbl>,
## # minuto <dbl>, fecha_hora <dttm>
La función select se puede utilizar para muchas funciones. Algunos ejemplos son:
Nota: Si es muy grande la base usamos everything.
select(vuelos_es, hora, tiempo_vuelo, everything())
## # A tibble: 336,776 × 19
## hora tiempo_vuelo anio mes dia horario_salida salida_programada
## <dbl> <dbl> <int> <int> <int> <int> <int>
## 1 5 227 2013 1 1 517 515
## 2 5 227 2013 1 1 533 529
## 3 5 160 2013 1 1 542 540
## 4 5 183 2013 1 1 544 545
## 5 6 116 2013 1 1 554 600
## 6 5 150 2013 1 1 554 558
## 7 6 158 2013 1 1 555 600
## 8 6 53 2013 1 1 557 600
## 9 6 140 2013 1 1 557 600
## 10 6 138 2013 1 1 558 600
## # ℹ 336,766 more rows
## # ℹ 12 more variables: atraso_salida <dbl>, horario_llegada <int>,
## # llegada_programada <int>, atraso_llegada <dbl>, aerolinea <chr>,
## # vuelo <int>, codigo_cola <chr>, origen <chr>, destino <chr>,
## # distancia <dbl>, minuto <dbl>, fecha_hora <dttm>
select(vuelos_es, horario_salida, atraso_salida, horario_llegada, atraso_llegada)
## # A tibble: 336,776 × 4
## horario_salida atraso_salida horario_llegada atraso_llegada
## <int> <dbl> <int> <dbl>
## 1 517 2 830 11
## 2 533 4 850 20
## 3 542 2 923 33
## 4 544 -1 1004 -18
## 5 554 -6 812 -25
## 6 554 -4 740 12
## 7 555 -5 913 19
## 8 557 -3 709 -14
## 9 557 -3 838 -8
## 10 558 -2 753 8
## # ℹ 336,766 more rows
# funcion any_of()
vars <- c("anio", "mes", "dia", "atraso_salidaa", "atraso_llegada")
select(vuelos_es, any_of(vars))
## # A tibble: 336,776 × 4
## anio mes dia atraso_llegada
## <int> <int> <int> <dbl>
## 1 2013 1 1 11
## 2 2013 1 1 20
## 3 2013 1 1 33
## 4 2013 1 1 -18
## 5 2013 1 1 -25
## 6 2013 1 1 12
## 7 2013 1 1 19
## 8 2013 1 1 -14
## 9 2013 1 1 -8
## 10 2013 1 1 8
## # ℹ 336,766 more rows
select(vuelos_es, (contains("horario")))
## # A tibble: 336,776 × 2
## horario_salida horario_llegada
## <int> <int>
## 1 517 830
## 2 533 850
## 3 542 923
## 4 544 1004
## 5 554 812
## 6 554 740
## 7 555 913
## 8 557 709
## 9 557 838
## 10 558 753
## # ℹ 336,766 more rows
vuelos_sml <- select(vuelos_es,anio:dia,
starts_with("atraso"),
distancia,
tiempo_vuelo)
mutate(vuelos_sml,
gain = atraso_salida - atraso_llegada,
velocidad = distancia / tiempo_vuelo * 60
)
## # A tibble: 336,776 × 9
## anio mes dia atraso_salida atraso_llegada distancia tiempo_vuelo gain
## <int> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2013 1 1 2 11 1400 227 -9
## 2 2013 1 1 4 20 1416 227 -16
## 3 2013 1 1 2 33 1089 160 -31
## 4 2013 1 1 -1 -18 1576 183 17
## 5 2013 1 1 -6 -25 762 116 19
## 6 2013 1 1 -4 12 719 150 -16
## 7 2013 1 1 -5 19 1065 158 -24
## 8 2013 1 1 -3 -14 229 53 11
## 9 2013 1 1 -3 -8 944 140 5
## 10 2013 1 1 -2 8 733 138 -10
## # ℹ 336,766 more rows
## # ℹ 1 more variable: velocidad <dbl>
Si queremos usar solo las nuevas variables creadas, usamos transmute()
transmute(vuelos_es,
gain = atraso_salida - atraso_llegada,
horas = tiempo_vuelo / 60,
gain_por_hora = gain / horas
)
## # A tibble: 336,776 × 3
## gain horas gain_por_hora
## <dbl> <dbl> <dbl>
## 1 -9 3.78 -2.38
## 2 -16 3.78 -4.23
## 3 -31 2.67 -11.6
## 4 17 3.05 5.57
## 5 19 1.93 9.83
## 6 -16 2.5 -6.4
## 7 -24 2.63 -9.11
## 8 11 0.883 12.5
## 9 5 2.33 2.14
## 10 -10 2.3 -4.35
## # ℹ 336,766 more rows
Nota La clave principal es: vectorizar. + operadores aritméticos ej:
air_time / 60, hour * 60+ minutes, etc.
otros: x / sum(x)
Calcula una porción del total, y y- mean(y) calcula la diferencia de la media-
dividir por ejemplo horas, minutos y segundos: %/% ( división integer) %%(resto)
transmute(vuelos_es,
horario_salida,
hora = horario_salida %/% 100,
minutos = horario_salida %% 100)
## # A tibble: 336,776 × 3
## horario_salida hora minutos
## <int> <dbl> <dbl>
## 1 517 5 17
## 2 533 5 33
## 3 542 5 42
## 4 544 5 44
## 5 554 5 54
## 6 554 5 54
## 7 555 5 55
## 8 557 5 57
## 9 557 5 57
## 10 558 5 58
## # ℹ 336,766 more rows
interesante las funciones logs: log(), log2(), log10(). permiten transformar en orden de magnitud logarítmica.
Offsets: lead(), and lag() valores adelantados o atrasados.
(x <- 1:10)
## [1] 1 2 3 4 5 6 7 8 9 10
lag(x)
## [1] NA 1 2 3 4 5 6 7 8 9
lead(x)
## [1] 2 3 4 5 6 7 8 9 10 NA
1- Comparar tiempo_vuelo con horario_llegada - horario_salida. ¿Que esperamos ver?. ¿Que vemos?. ¿Que necesitamos arreglar??.
vuelos <-vuelos_es %>%
mutate(aire_t = tiempo_vuelo /100) %>%
select(aire_t, tiempo_vuelo, everything()) %>%
mutate(llegada_t = horario_llegada/100) %>%
select(llegada_t, everything())
2- Analizar horario_salida, salida_programada, atraso_salida
vuelos_es %>% select(horario_salida, salida_programada, atraso_salida)
## # A tibble: 336,776 × 3
## horario_salida salida_programada atraso_salida
## <int> <int> <dbl>
## 1 517 515 2
## 2 533 529 4
## 3 542 540 2
## 4 544 545 -1
## 5 554 600 -6
## 6 554 558 -4
## 7 555 600 -5
## 8 557 600 -3
## 9 557 600 -3
## 10 558 600 -2
## # ℹ 336,766 more rows
3- Encuentra los 10 vuelos más demorados usando la función ranking.
mas_demorados <- desc(dense_rank(vuelos_es$atraso_llegada))
summarise(vuelos_es, atraso_salida =mean(atraso_salida, na.rm = TRUE))
## # A tibble: 1 × 1
## atraso_salida
## <dbl>
## 1 12.6
summarise + group_by()
diario <- group_by(vuelos_es, anio, mes, dia)
summarise(diario, atraso = mean(atraso_salida, na.rm = TRUE))
## `summarise()` has grouped output by 'anio', 'mes'. You can override using the
## `.groups` argument.
## # A tibble: 365 × 4
## # Groups: anio, mes [12]
## anio mes dia atraso
## <int> <int> <int> <dbl>
## 1 2013 1 1 11.5
## 2 2013 1 2 13.9
## 3 2013 1 3 11.0
## 4 2013 1 4 8.95
## 5 2013 1 5 5.73
## 6 2013 1 6 7.15
## 7 2013 1 7 5.42
## 8 2013 1 8 2.55
## 9 2013 1 9 2.28
## 10 2013 1 10 2.84
## # ℹ 355 more rows
Si queremos ver la relación entre la distancia y el promedio de demoras por cada ubicación. Podemos:
por_destino <- group_by(vuelos_es, destino)
atraso <- summarise(por_destino,
count = n(),
dist = mean(distancia, na.rm = TRUE),
atraso = mean(atraso_salida, na.rm = TRUE)
)
# Mejor forma de escribir con pipa
demorados <- vuelos_es %>%
group_by(destino) %>%
summarise(
count = n(),
dist = mean(distancia, na.rm = TRUE),
demora = mean(atraso_llegada, na.rm = TRUE)
) %>%
filter(count > 20, destino != "HNL")
ggplot(data = demorados, mapping = aes(x = dist, y = demora)) +
geom_point(aes(size = count), alpha = 1/3) +
geom_smooth(se = FALSE)
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
not_cancelled <- vuelos_es %>%
filter(!is.na(atraso_salida), !is.na(atraso_llegada))
not_cancelled %>%
group_by(anio, mes, dia) %>%
summarise(mean = mean(atraso_llegada))
## `summarise()` has grouped output by 'anio', 'mes'. You can override using the
## `.groups` argument.
## # A tibble: 365 × 4
## # Groups: anio, mes [12]
## anio mes dia mean
## <int> <int> <int> <dbl>
## 1 2013 1 1 12.7
## 2 2013 1 2 12.7
## 3 2013 1 3 5.73
## 4 2013 1 4 -1.93
## 5 2013 1 5 -1.53
## 6 2013 1 6 4.24
## 7 2013 1 7 -4.95
## 8 2013 1 8 -3.23
## 9 2013 1 9 -0.264
## 10 2013 1 10 -5.90
## # ℹ 355 more rows
Cuando se hacen agregaciones es buena idea contar n() o contar los valores perdidos (sum(!is.na(x))) así se pueden chequear los resultados basados en un pequeño grupo de datos.
Tomamos los datos del paquete Lahman y queremos ver el promedio de las ligas mayores de básquet (número de aciertos / número de intentos)
Veremos:
# Convertimos a tibble.
batting <- as_tibble(Lahman::Batting)
batters <- batting %>%
group_by(playerID) %>%
summarise(
ba = sum(H, na.rm = TRUE / sum(AB, na.rm = TRUE),
ab = sum(AB, na.rm = TRUE))
)
#batters %>%
# filter(ab > 100) %>%
# ggplot(mapping = aes(x =ab, y =ba)) +
# geom_point() +
# geom_smooth(se = FALSE)
#geom_smooth() usa el método = gam y la formula es 'y ~ s(x, bs = "cs")
Esto también tiene implicaciones importantes para la clasificación. Si clasifica ingenuamente en desc (ba), las personas con los mejores promedios de bateo son claramente afortunadas, no hábiles:
http://varianceexplained.org/r/empirical_bayes_baseball/ and http://www.evanmiller.org/how-not-to-sort-by-average-rating.html>
batters %>%
arrange(desc(ba))
## # A tibble: 20,469 × 2
## playerID ba
## <chr> <int>
## 1 rosepe01 18309
## 2 aaronha01 16135
## 3 cobbty01 15625
## 4 yastrca01 15407
## 5 pujolal01 14805
## 6 ripkeca01 14735
## 7 jeterde01 14660
## 8 musiast01 14602
## 9 murraed02 14591
## 10 beltrad01 14234
## # ℹ 20,459 more rows
Las medidas means, conts y sum nos brindan mucha información. Tengamos en cuenta estas medidas por ubicación:
not_cancelled %>%
group_by(anio, mes, dia) %>%
summarise(
avg_delay1 = mean(atraso_llegada),
avg_delay2 = mean(atraso_llegada[atraso_llegada > 0]))
## `summarise()` has grouped output by 'anio', 'mes'. You can override using the
## `.groups` argument.
## # A tibble: 365 × 5
## # Groups: anio, mes [12]
## anio mes dia avg_delay1 avg_delay2
## <int> <int> <int> <dbl> <dbl>
## 1 2013 1 1 12.7 32.5
## 2 2013 1 2 12.7 32.0
## 3 2013 1 3 5.73 27.7
## 4 2013 1 4 -1.93 28.3
## 5 2013 1 5 -1.53 22.6
## 6 2013 1 6 4.24 24.4
## 7 2013 1 7 -4.95 27.8
## 8 2013 1 8 -3.23 20.8
## 9 2013 1 9 -0.264 25.6
## 10 2013 1 10 -5.90 27.3
## # ℹ 355 more rows
# usamos >0 para que sean positivos
Medidas de desviaciones
sd(x) Desviación estándar, raiz del promedio cuadrado de la desviación (mejor dicho: desviación cuadrática media raíz) es la medida estándar de la desviación.
IQR rango intercuartil
mad() media absoluta de la desviación. Esta medida es robusta y es muy útil si tenemos valores atípicos.
Ejemplo: ¿Porqué algunos destinos son más variables que otros?
not_cancelled %>%
group_by(destino) %>%
summarise(distancia_sd = sd(distancia)) %>%
arrange(desc(distancia_sd))
## # A tibble: 104 × 2
## destino distancia_sd
## <chr> <dbl>
## 1 EGE 10.5
## 2 SAN 10.4
## 3 SFO 10.2
## 4 HNL 10.0
## 5 SEA 9.98
## 6 LAS 9.91
## 7 PDX 9.87
## 8 PHX 9.86
## 9 LAX 9.66
## 10 IND 9.46
## # ℹ 94 more rows
Medidas de rank
Los quantiles son la generalización de la mediana -median- Por ejemplo, quantile(x, 0.25) encontraremos valores de x que sean mas grande que el 25% y menos que el 75%
Ejemplo: ¿Cuándo sale el primer y el último avión?
not_cancelled %>%
group_by(anio, mes, dia) %>%
summarise(
primero = min(horario_llegada),
last = max(atraso_llegada)
)
## `summarise()` has grouped output by 'anio', 'mes'. You can override using the
## `.groups` argument.
## # A tibble: 365 × 5
## # Groups: anio, mes [12]
## anio mes dia primero last
## <int> <int> <int> <int> <dbl>
## 1 2013 1 1 3 851
## 2 2013 1 2 1 368
## 3 2013 1 3 4 285
## 4 2013 1 4 2 276
## 5 2013 1 5 4 308
## 6 2013 1 6 2 175
## 7 2013 1 7 2 368
## 8 2013 1 8 10 184
## 9 2013 1 9 12 1272
## 10 2013 1 10 2 1109
## # ℹ 355 more rows
Medidas de posición first(), nth(), last() primero, segundo y último.
not_cancelled %>%
group_by(anio, mes, dia) %>%
summarise(
first_dep = first(horario_salida),
last_dep = last(horario_salida)
)
## `summarise()` has grouped output by 'anio', 'mes'. You can override using the
## `.groups` argument.
## # A tibble: 365 × 5
## # Groups: anio, mes [12]
## anio mes dia first_dep last_dep
## <int> <int> <int> <int> <int>
## 1 2013 1 1 517 2356
## 2 2013 1 2 42 2354
## 3 2013 1 3 32 2349
## 4 2013 1 4 25 2358
## 5 2013 1 5 14 2357
## 6 2013 1 6 16 2355
## 7 2013 1 7 49 2359
## 8 2013 1 8 454 2351
## 9 2013 1 9 2 2252
## 10 2013 1 10 3 2320
## # ℹ 355 more rows
Podemos utilizar estas funciones con filter, así nos da todas las variables con las observaciones en filas separadas.
not_cancelled %>%
group_by(anio, mes, dia) %>%
mutate(r = min_rank(desc(horario_salida))) %>%
filter(r %in% range(r))
## # A tibble: 770 × 20
## # Groups: anio, mes, dia [365]
## anio mes dia horario_salida salida_programada atraso_salida
## <int> <int> <int> <int> <int> <dbl>
## 1 2013 1 1 517 515 2
## 2 2013 1 1 2356 2359 -3
## 3 2013 1 2 42 2359 43
## 4 2013 1 2 2354 2359 -5
## 5 2013 1 3 32 2359 33
## 6 2013 1 3 2349 2359 -10
## 7 2013 1 4 25 2359 26
## 8 2013 1 4 2358 2359 -1
## 9 2013 1 4 2358 2359 -1
## 10 2013 1 5 14 2359 15
## # ℹ 760 more rows
## # ℹ 14 more variables: horario_llegada <int>, llegada_programada <int>,
## # atraso_llegada <dbl>, aerolinea <chr>, vuelo <int>, codigo_cola <chr>,
## # origen <chr>, destino <chr>, tiempo_vuelo <dbl>, distancia <dbl>,
## # hora <dbl>, minuto <dbl>, fecha_hora <dttm>, r <int>
** counts: vimos n() que no toma argumentos sino que nos da el tamaño del grupo. Si queremos contar el número de los valores no perdidos, sum(!is.na(x)). Contar el número de valores únicos (unique) usamos n_distint(x)
Ejemplo: ¿Qué destinos tienen más transportistas?
not_cancelled %>%
group_by(destino) %>%
summarise(aerolineas = n_distinct(aerolinea)) %>%
arrange(desc(aerolineas))
## # A tibble: 104 × 2
## destino aerolineas
## <chr> <int>
## 1 ATL 7
## 2 BOS 7
## 3 CLT 7
## 4 ORD 7
## 5 TPA 7
## 6 AUS 6
## 7 DCA 6
## 8 DTW 6
## 9 IAD 6
## 10 MSP 6
## # ℹ 94 more rows
Si queremos solo contar dplyr nos provee un ayudante perfecto:
not_cancelled %>%
count(destino)
## # A tibble: 104 × 2
## destino n
## <chr> <int>
## 1 ABQ 254
## 2 ACK 264
## 3 ALB 418
## 4 ANC 8
## 5 ATL 16837
## 6 AUS 2411
## 7 AVL 261
## 8 BDL 412
## 9 BGR 358
## 10 BHM 269
## # ℹ 94 more rows
Si queremos darle peso a la variables, por ejemplo vemos la cantidad de millas que voló ese avión.
#not_cancelled %>%
# count(tailnum, wt = distancia)
Podemos hacer max con los valores lógicos. sum(x>10), mean(y==0) Cuando usamos funciones numéricas, TRUE se convierte en 1 y FALSE se convierte en 0. Esto nos convierte las funciones sum() y mean() muy útiles: sum() nos va el numero de TRUE s in x, y mean() nos da la proporción.
¿ Cuantos vuelos salieron antes de las 5am? ( generalmente son vuelos demorados)
not_cancelled %>%
group_by(anio, mes, dia) %>%
summarise(n_tempranos = sum(horario_salida < 500))
## `summarise()` has grouped output by 'anio', 'mes'. You can override using the
## `.groups` argument.
## # A tibble: 365 × 4
## # Groups: anio, mes [12]
## anio mes dia n_tempranos
## <int> <int> <int> <int>
## 1 2013 1 1 0
## 2 2013 1 2 3
## 3 2013 1 3 4
## 4 2013 1 4 3
## 5 2013 1 5 3
## 6 2013 1 6 2
## 7 2013 1 7 2
## 8 2013 1 8 1
## 9 2013 1 9 3
## 10 2013 1 10 3
## # ℹ 355 more rows
¿Que proporción de vuelos están demorados por más de una hora?
#not_cancelled %>%
# group_by(anio, mes, dia) %>%
# summarise(hour_prop = mean(horario_llegada > 60))