Felipe Sodré Mendes Barros
02/11/2018
e-mail: felipe.b4rros@gmail.com
Vamos usar una nueva librería llamada dplyr; Manipulación que haremos:
⚠️ Estas funciones poseen la mismo sintaxis: ⚠️
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)
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>
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:
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>
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>
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?
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>
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:
subconjunto <- filter(flights, arr_delay > 0, dep_delay >= 0)
ggplot(data = subconjunto) +
geom_point(mapping = aes(x = arr_delay, y = dep_delay))
⚠️ 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))
Crear un grafico de dispersión entre retraso en la salida con los retrasos de llegada de los vuelos con:
retrasos <- filter(flights, arr_delay > 120 | dep_delay > 120 & year == 2013)
ggplot(retrasos, aes(x=arr_delay, y=dep_delay)) +
geom_point()
huston <- filter(flights, dest %in% c("IAH", "HOU"))
ggplot(data = huston, aes(x= dest)) +
geom_bar()
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>
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>
Identifique los vuelos:
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
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)
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)
Como podríamos selecionar las variables:
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