Transformación de datos

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)

Datos

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

Filter()

dia1 <- filter(vuelos_es, mes==1, dia==1) 

Ejericios:

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)

O de esta manera:

(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:

  1. Cuantos vuelos no salieron a tiempo. Que otra variable necesitamos. Qué representan los campos: horario_salida y salida_programada.
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)

Arrange()

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())

Ejercicios:

  1. Cómo usar arrange() para ordenar todos los valores que faltan al principio.
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()

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:

  • starts_with(“abc”)
  • end_with, contains
  • matches
  • num_range

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>

Ejercicios

  1. seleccionar algunas variables.
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

mutate()

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
  • Sumas acumulativas, mínimos y máximos:
    • cumsum(),
    • cumprod(),
    • cummin(), cummax(); cumean()
  • rankings ver que hacen estas funciones:
  • min_rank(),
  • row_number(),
  • dense_rank(),
  • percent_rank(),
  • cume_dist(),
  • ntile()

Ejercicios

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))

Summaries with summarise()

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

Concepto de Pipa

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'

Missing value

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

Counts

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.

Otra variación en estos patrones.

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:

  • La variación desciende cuando agregamos más datos.
  • Hay una relación correlativa positiva entre “skill” y la oportunidad de acierto (ab). Esto es porque el equipo elige obviamente el mejor jugador.
# 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

Funciones comunes de Summary

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))