Manejo de datos con Tibble

En esta sesion veremos el tipo de datos Tibble. Este tipo de datos es similar a un dataframe pero que facilita mucho los filtrados.

library(dplyr)
library(nycflights13)
flights
## # A tibble: 336,776 x 19
##     year month   day dep_t… sched_… dep_d… arr_… sched… arr_d… carr… flig…
##    <int> <int> <int>  <int>   <int>  <dbl> <int>  <int>  <dbl> <chr> <int>
##  1  2013     1     1    517     515   2.00   830    819  11.0  UA     1545
##  2  2013     1     1    533     529   4.00   850    830  20.0  UA     1714
##  3  2013     1     1    542     540   2.00   923    850  33.0  AA     1141
##  4  2013     1     1    544     545  -1.00  1004   1022 -18.0  B6      725
##  5  2013     1     1    554     600  -6.00   812    837 -25.0  DL      461
##  6  2013     1     1    554     558  -4.00   740    728  12.0  UA     1696
##  7  2013     1     1    555     600  -5.00   913    854  19.0  B6      507
##  8  2013     1     1    557     600  -3.00   709    723 -14.0  EV     5708
##  9  2013     1     1    557     600  -3.00   838    846 - 8.00 B6       79
## 10  2013     1     1    558     600  -2.00   753    745   8.00 AA      301
## # ... with 336,766 more rows, and 8 more variables: tailnum <chr>, origin
## #   <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, minute
## #   <dbl>, time_hour <dttm>
unoEnero<-filter(flights, month==1, day==1)

Podemos hacer filtrados más complejos como por ejemplo:

#Llegadas con más de 120 minutos
retrasoLlegadas<-filter(flights, arr_delay > 120)
retrasoLlegadas
## # A tibble: 10,034 x 19
##     year month   day dep_… sche… dep_… arr_… sche… arr_… carr… flig… tail…
##    <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> <int> <chr>
##  1  2013     1     1   811   630 101    1047   830   137 MQ     4576 N531…
##  2  2013     1     1   848  1835 853    1001  1950   851 MQ     3944 N942…
##  3  2013     1     1   957   733 144    1056   853   123 UA      856 N534…
##  4  2013     1     1  1114   900 134    1447  1222   145 UA     1086 N765…
##  5  2013     1     1  1505  1310 115    1638  1431   127 EV     4497 N179…
##  6  2013     1     1  1525  1340 105    1831  1626   125 B6      525 N231…
##  7  2013     1     1  1549  1445  64.0  1912  1656   136 EV     4181 N211…
##  8  2013     1     1  1558  1359 119    1718  1515   123 EV     5712 N826…
##  9  2013     1     1  1732  1630  62.0  2028  1825   123 EV     4092 N169…
## 10  2013     1     1  1803  1620 103    2008  1750   138 MQ     4622 N504…
## # ... with 10,024 more rows, and 7 more variables: origin <chr>, dest
## #   <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>,
## #   time_hour <dttm>
#Llegadas con más de 120 y el retraso en la salida también mayor de 120
retrasoLlegadasYSalidas<-filter(flights, arr_delay > 120 & dep_delay > 120)
retrasoLlegadasYSalidas
## # A tibble: 8,335 x 19
##     year month   day dep_… sche… dep_… arr_… sche… arr_… carr… flig… tail…
##    <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> <int> <chr>
##  1  2013     1     1   848  1835   853  1001  1950   851 MQ     3944 N942…
##  2  2013     1     1   957   733   144  1056   853   123 UA      856 N534…
##  3  2013     1     1  1114   900   134  1447  1222   145 UA     1086 N765…
##  4  2013     1     1  1815  1325   290  2120  1542   338 EV     4417 N171…
##  5  2013     1     1  1842  1422   260  1958  1535   263 EV     4633 N181…
##  6  2013     1     1  1856  1645   131  2212  2005   127 AA      181 N323…
##  7  2013     1     1  1934  1725   129  2126  1855   151 MQ     4255 N909…
##  8  2013     1     1  1938  1703   155  2109  1823   166 EV     4300 N185…
##  9  2013     1     1  1942  1705   157  2124  1830   174 MQ     4410 N835…
## 10  2013     1     1  2006  1630   216  2230  1848   222 EV     4644 N149…
## # ... with 8,325 more rows, and 7 more variables: origin <chr>, dest
## #   <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>,
## #   time_hour <dttm>

También podemos usar rangos, para ello:

eneroFebreroMarzo <- filter(flights, month %in% c(1,2,3))
eneroFebreroMarzo
## # A tibble: 80,789 x 19
##     year month   day dep_t… sched_… dep_d… arr_… sched… arr_d… carr… flig…
##    <int> <int> <int>  <int>   <int>  <dbl> <int>  <int>  <dbl> <chr> <int>
##  1  2013     1     1    517     515   2.00   830    819  11.0  UA     1545
##  2  2013     1     1    533     529   4.00   850    830  20.0  UA     1714
##  3  2013     1     1    542     540   2.00   923    850  33.0  AA     1141
##  4  2013     1     1    544     545  -1.00  1004   1022 -18.0  B6      725
##  5  2013     1     1    554     600  -6.00   812    837 -25.0  DL      461
##  6  2013     1     1    554     558  -4.00   740    728  12.0  UA     1696
##  7  2013     1     1    555     600  -5.00   913    854  19.0  B6      507
##  8  2013     1     1    557     600  -3.00   709    723 -14.0  EV     5708
##  9  2013     1     1    557     600  -3.00   838    846 - 8.00 B6       79
## 10  2013     1     1    558     600  -2.00   753    745   8.00 AA      301
## # ... with 80,779 more rows, and 8 more variables: tailnum <chr>, origin
## #   <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, minute
## #   <dbl>, time_hour <dttm>

Si por ejemplo queremos ordenar las instancias en función de origen y destino:

origenDestino <-arrange(flights, origin, dest)
origenDestino
## # A tibble: 336,776 x 19
##     year month   day dep_t… sched… dep_del… arr_… sche… arr_d… carr… flig…
##    <int> <int> <int>  <int>  <int>    <dbl> <int> <int>  <dbl> <chr> <int>
##  1  2013     1     1   1315   1317  -  2.00  1413  1423 -10.0  EV     4112
##  2  2013     1     1   1655   1621    34.0   1804  1724  40.0  EV     3260
##  3  2013     1     1   2056   2004    52.0   2156  2112  44.0  EV     4170
##  4  2013     1     2   1332   1327     5.00  1419  1433 -14.0  EV     4316
##  5  2013     1     2   1746   1621    85.0   1835  1724  71.0  EV     3260
##  6  2013     1     2   2148   2004   104     2234  2112  82.0  EV     4170
##  7  2013     1     3   1716   1619    57.0   1803  1723  40.0  EV     4271
##  8  2013     1     3   2031   2038  -  7.00  2131  2139 - 8.00 EV     4309
##  9  2013     1     4   1618   1619  -  1.00  1714  1723 - 9.00 EV     4271
## 10  2013     1     4   2031   2000    31.0   2131  2101  30.0  EV     4309
## # ... with 336,766 more rows, and 8 more variables: tailnum <chr>, origin
## #   <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, minute
## #   <dbl>, time_hour <dttm>

Si queremos seleccionar algunas columnas, se pueden seleccionar de manera sencilla de la sigueiente manera:

#Selección básica
seleccionadas <- select(flights, year, month, day)

#Selección por rango
seleccionadas <- select(flights, year:dest)

#Selección por rango inverso
seleccionadas<- select(flights, -(year:dest))

#Las variables que empiezan por a
seleccionadas<- select(flights, starts_with("a"))

#Las variables que acaban por a
seleccionadas<- select(flights, ends_with("a"))

#Las variables que contienen -
seleccionadas<- select(flights, contains("a"))

El tipo de datos Tibble también facilita el renombrado de variables.

conCambio <- rename(flights, tailnumber=tailnum) 

Introducción de nuevas variables. Útil para el proceso de generación de características.

versionNueva <- mutate(flights, gain=arr_delay-dep_delay)

#Si solo queremos tener las nuevas variables en lugar de mutate transmutate
versionNueva <- mutate(flights, gain=arr_delay-dep_delay)

El tipo de datos Tibble también permite el agrupamiento de isntancias, similar al group by de SQL.

porDia<-group_by(flights, year, month, day)
resume<-summarise(porDia, delay=mean(dep_delay,na.rm = TRUE))
resume
## # A tibble: 365 x 4
## # Groups: year, month [?]
##     year month   day delay
##    <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
## # ... with 355 more rows

Ahora vamos a encadenar ordenes:

porDestino <- group_by(flights, dest)
retraso <- summarise(porDestino, count=n(), dist=mean(distance,na.rm = TRUE), delay=mean(dep_delay,na.rm = TRUE))
filtrado<-filter(retraso, count > 20, dest != "HNL")
filtrado
## # A tibble: 96 x 4
##    dest  count  dist delay
##    <chr> <int> <dbl> <dbl>
##  1 ABQ     254  1826 13.7 
##  2 ACK     265   199  6.46
##  3 ALB     439   143 23.6 
##  4 ATL   17215   757 12.5 
##  5 AUS    2439  1514 13.0 
##  6 AVL     275   584  8.19
##  7 BDL     443   116 17.7 
##  8 BGR     375   378 19.5 
##  9 BHM     297   866 29.7 
## 10 BNA    6333   758 16.0 
## # ... with 86 more rows

Por último dibujamos el gráfico.

library(ggplot2)
ggplot(data=filtrado, mapping = aes(x=dist, y=delay)) + 
  geom_point(aes(size=count), alpha=1/3) +
  geom_smooth(se=F)
## `geom_smooth()` using method = 'loess'

Podemos hacerlo todo en una misma orden de la siguiente manera:

resultado<- flights %>%
            group_by(dest) %>%
            summarise(count=n(),
                      dist=mean(distance,na.rm = TRUE),
                      delay=mean(dep_delay,na.rm = TRUE)) %>%
            filter(count > 20, dest != "HNL")

ggplot(data=resultado, mapping = aes(x=dist, y=delay)) + 
  geom_point(aes(size=count), alpha=1/3) +
  geom_smooth(se=F)
## `geom_smooth()` using method = 'loess'

Podemos convertir los datos a Tibble, usando como siempre la funcion as:

datos<-as_tibble(iris)
datos
## # A tibble: 150 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fctr> 
##  1         5.10        3.50         1.40       0.200 setosa 
##  2         4.90        3.00         1.40       0.200 setosa 
##  3         4.70        3.20         1.30       0.200 setosa 
##  4         4.60        3.10         1.50       0.200 setosa 
##  5         5.00        3.60         1.40       0.200 setosa 
##  6         5.40        3.90         1.70       0.400 setosa 
##  7         4.60        3.40         1.40       0.300 setosa 
##  8         5.00        3.40         1.50       0.200 setosa 
##  9         4.40        2.90         1.40       0.200 setosa 
## 10         4.90        3.10         1.50       0.100 setosa 
## # ... with 140 more rows