Transformacion de datos

Felipe Sodré Mendes Barros
02/11/2018

Contenidos

Vamos usar una nueva librería llamada dplyr; Manipulación que haremos:

  • Filtrado de datos: función filter();
  • Reorganizar regístros: función arrange();
  • Seleción de variables (columnas) por nombre: función select();

⚠️ Estas funciones poseen la mismo sintaxis: ⚠️

  1. Primero argumento es el dato (data.frame);
  2. Segundo argumento describe que debe ser hecho con el dato;
  3. El resultado será otro data.frame

Instalación de las librerías

En esta clase vammos usar las funciones de la librería dplyr y datos de vuelos de NY, disponibles en la librería nycflights13.

# Instalación librerías
# install.packages("dplyr")
library(dplyr)

# Para ocupar datos de vuelos!
# install.packages(nycflights13)
library(nycflights13)

# para los graficos
library(ggplot2)

Vuelos

El dato que vamos ocupar ya esta cargado en el obyecto flights de la librería dplyr.

# A tibble: 336,776 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>
 1  2013     1     1      517            515         2      830
 2  2013     1     1      533            529         4      850
 3  2013     1     1      542            540         2      923
 4  2013     1     1      544            545        -1     1004
 5  2013     1     1      554            600        -6      812
 6  2013     1     1      554            558        -4      740
 7  2013     1     1      555            600        -5      913
 8  2013     1     1      557            600        -3      709
 9  2013     1     1      557            600        -3      838
10  2013     1     1      558            600        -2      753
# ... with 336,766 more rows, and 12 more variables: sched_arr_time <int>,
#   arr_delay <dbl>, carrier <chr>, flight <int>, tailnum <chr>,
#   origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
#   minute <dbl>, time_hour <dttm>

Tibble

Perciba que el objecto es distinto: tibble. Se trata de un data.frame con algunas facilidades.
Ej.: No hace falta usar la funcion head(), pues siempre presentará la cantidad reducida de datos. Además, trae info de las variables:

  • int
  • dbl
  • chr
  • dttm (date-times)
  • lgl (TRUE / FALSE)
  • fctr (categoricos)
  • date

filter()

La función filter() como el proprio nombre deja claro, sirve para obtener un subconjunto del datos de entrada (primero argumento). El subconjunto será/n la/s expresion/es a seren aplicadas. Ej. Quiero trabajar con los vuelos del mes de febrero (2):

filter(flights, month == 2)
# A tibble: 24,951 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>
 1  2013     2     1      456            500        -4      652
 2  2013     2     1      520            525        -5      816
 3  2013     2     1      527            530        -3      837
 4  2013     2     1      532            540        -8     1007
 5  2013     2     1      540            540         0      859
 6  2013     2     1      552            600        -8      714
 7  2013     2     1      552            600        -8      919
 8  2013     2     1      552            600        -8      655
 9  2013     2     1      553            600        -7      833
10  2013     2     1      553            600        -7      821
# ... with 24,941 more rows, and 12 more variables: sched_arr_time <int>,
#   arr_delay <dbl>, carrier <chr>, flight <int>, tailnum <chr>,
#   origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
#   minute <dbl>, time_hour <dttm>

filter() II

Se puede agregar mas de una expresión a la función filter():

filter(flights, month == 2, day == 1)
# A tibble: 926 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>
 1  2013     2     1      456            500        -4      652
 2  2013     2     1      520            525        -5      816
 3  2013     2     1      527            530        -3      837
 4  2013     2     1      532            540        -8     1007
 5  2013     2     1      540            540         0      859
 6  2013     2     1      552            600        -8      714
 7  2013     2     1      552            600        -8      919
 8  2013     2     1      552            600        -8      655
 9  2013     2     1      553            600        -7      833
10  2013     2     1      553            600        -7      821
# ... with 916 more rows, and 12 more variables: sched_arr_time <int>,
#   arr_delay <dbl>, carrier <chr>, flight <int>, tailnum <chr>,
#   origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
#   minute <dbl>, time_hour <dttm>

Ejercícios I: filter()

Como sería el codigo para filtrar los vuelos que occurieron depúes de marzo y que el retrazo de llegada (arr_delay) fué mayor o igual a 5?

Ejercícios I: resultados

filter(flights, month > 5, arr_delay >= 5)
# A tibble: 67,092 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>
 1  2013    10     1      558            600        -2      726
 2  2013    10     1      605            559         6      722
 3  2013    10     1      627            630        -3      809
 4  2013    10     1      650            655        -5      847
 5  2013    10     1      713            640        33      844
 6  2013    10     1      729            735        -6     1049
 7  2013    10     1      736            620        76      933
 8  2013    10     1      742            659        43      923
 9  2013    10     1      753            800        -7      924
10  2013    10     1      758            735        23     1052
# ... with 67,082 more rows, and 12 more variables: sched_arr_time <int>,
#   arr_delay <dbl>, carrier <chr>, flight <int>, tailnum <chr>,
#   origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
#   minute <dbl>, time_hour <dttm>

Ejercícios II: filter()

Como sería el codigo para hacer un grafico de dispersión entre arr_delay (variable explicativa) y dep_delay (variable dependiente) de los vuelos con:

  • arr_delay mayor que cero y
  • dep_delay mayor o igual a cero

Ejercícios II: resultado

subconjunto <- filter(flights, arr_delay > 0, dep_delay >= 0)
ggplot(data = subconjunto) +
  geom_point(mapping = aes(x = arr_delay, y = dep_delay))

plot of chunk unnamed-chunk-6

Expresiones

  • == (igual)
  • != (diferente)
  • > (mayor que)
  • >= (mayor o igual que)
  • < (menor que)
  • <= (menor o igual que)

Operadores lógicos

filter() y Operadores lógicos

⚠️ Perciba que al agregar las expresiones en distintos paremetros (usando coma) se ocupará la expresión 'y'.
Caso vaya ocupar otros operadores lógicos, hay que informar la variable siempre:

filter(flights, month == 11 | month == 12)

Otra posiblidad es usar la expresión %in% cuando hay mas de un valor para la misma variabe:

filter(flights, month %in% c(11, 12))

Ejercícios III: filter() operadores logicos

Crear un grafico de dispersión entre retraso en la salida con los retrasos de llegada de los vuelos con:

  • llegada o partida mayor que 2;
  • Vuelos para Houston (IAH o HOU);
  • Grafico de barras con la cantidad de vuelos de cada aeropuesto de Huston

Ejercícios III: resultado 1

retrasos <- filter(flights, arr_delay > 120 | dep_delay > 120 & year == 2013)
ggplot(retrasos, aes(x=arr_delay, y=dep_delay)) + 
  geom_point()

plot of chunk unnamed-chunk-9

Ejercícios III: resultado 2

huston <- filter(flights, dest %in% c("IAH", "HOU"))
ggplot(data = huston, aes(x= dest)) +
  geom_bar()

plot of chunk unnamed-chunk-10

arrange()

Ordena las líneas según valores de las columnas. order by Ej.: Ordenando los datos por año, mes y hora de llegada.

arrange(flights, year, month, arr_time)
# A tibble: 336,776 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>
 1  2013     1     2     2130           2130         0        1
 2  2013     1    11     2157           2000       117        1
 3  2013     1    11     2253           2249         4        1
 4  2013     1    14     2122           2130        -8        1
 5  2013     1    14     2246           2250        -4        1
 6  2013     1    15     2304           2245        19        1
 7  2013     1    16     2018           2025        -7        1
 8  2013     1    16     2303           2245        18        1
 9  2013     1    19     2107           2110        -3        1
10  2013     1    22     2246           2249        -3        1
# ... with 336,766 more rows, and 12 more variables: sched_arr_time <int>,
#   arr_delay <dbl>, carrier <chr>, flight <int>, tailnum <chr>,
#   origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
#   minute <dbl>, time_hour <dttm>

arrange()

Caso quiera inverter el orden, se puede usar la función desc() para decresciente; Ej.: Ordenando los datos por año, mes y hora de llegada, siendo las ultimas horas primero.

arrange(flights, year, month, desc(arr_time))
# A tibble: 336,776 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>
 1  2013     1     1     2209           2155        14     2400
 2  2013     1     5     2116           2130       -14     2400
 3  2013     1    13     2243           2129        74     2400
 4  2013     1    16     2138           2107        31     2400
 5  2013     1    17     2256           2249         7     2400
 6  2013     1    22     2212           2055        77     2400
 7  2013     1    22     2249           2125        84     2400
 8  2013     1    25     2055           1725       210     2400
 9  2013     1    28     2303           2250        13     2400
10  2013     1    30     2155           1915       160     2400
# ... with 336,766 more rows, and 12 more variables: sched_arr_time <int>,
#   arr_delay <dbl>, carrier <chr>, flight <int>, tailnum <chr>,
#   origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
#   minute <dbl>, time_hour <dttm>

Ejercícios IV: arrange()

Identifique los vuelos:

  • con mayor retraso;
  • con salida mas temprana;
  • vuelos con menos tiempo en el aire
  • vuelos con menos tiempo pero con mayor tiempo de retraso

Valores desconocidos: NA

En la función arrange() los valores NA estarán siempre por último, ya que no posee orden. Vale la pena aclarar. Valores desconocidos, poseen características particulares: Cales son los resultados de estos codigos?

NA > 5
10 == NA
NA + 10
NA / 2
NA == NA

Si querés usar operador logico con valores NA, se debe usar is.na():

is.na(NA)
[1] TRUE

select()

La función select() sirve para selecionar un subconjunto de las variables (columnas) de los datos trabajados.
Por ejemplo, si queremos trabajar apenas con las variables year, day y month, haríamos:

# select() subset columns
select(flights, year, day, month)

Select() II

Si necesitas remover una variables, también se puede usar la función select(), pero con guion antes de la variables a ser removida:

# removendo year
select(flights, -year)
# removendo year y day
select(flights, -year, -day)

Ejecícios V: select()

Como podríamos selecionar las variables:

  • dep_time
  • dep_delay
  • arr_time
  • arr_delay

Ejecícios V: resultado

select(flights, dep_time, dep_delay, arr_time, arr_delay)
# A tibble: 336,776 x 4
   dep_time dep_delay arr_time arr_delay
      <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
# ... with 336,766 more rows