Repaso

Crear proyecto nuevo

Crear un nuevo proyecto en nuevo directorio: “repaso-rbasico”

Crear documento R Markdown

  1. Crear un nuevo archivo R Markdown:
    • Documento HTML
    • Título: “Repaso de R básico”
    • Contenido: Según el escenario presentado

Escenario 1

Te comparten el conjunto de datos “gapminder.xlsx”. Necesitas importar el conjunto de datos y contestar algunas preguntas.

  1. ¿Cuántas filas tiene el conjunto de datos?
  2. ¿Cuántas columnas tiene el conjunto de datos?
  3. ¿Cuál es la unidad de observación del conjunto de datos?
  4. ¿Cuántas columnas contiene valores numéricos?
  5. ¿Cuántas contiene valores categóricos?

Publicar en Rpubs.com el resultado de hacerle Knit al documento.

Escenario 2

Generar un tibble de tres (3) observaciones con las siguientes columnas:

  • deporte (texto): nombre del deporte
  • jugadores (numérico): cantidad de jugadores necesarios practicar ese deporte
  • limite_tiempo (lógico): ¿una partida oficial tiene límite de tiempo?
  • duración (numérico): duración normal de una partida oficial, en minutos

Ver ejemplo en la siguiente lámina

deporte jugadores limite_tiempo duracion
Baloncesto 10 TRUE 48
Ajedrez 2 FALSE NA

dplyr

Crear nuevo proyecto

Para que mantengas un buen orden en tu aprendizaje, es momento de crear un nuevo proyecto en el que irás anotando todo lo que aprendas en esta sesión. Cabe mencionar que todo lo que anotes deberás publicarlo al final en tu perfil de Rpubs.com

  • Crear un nuevo proyecto en nuevo directorio: “dplyr”

Crear documento R Markdown

  • Crear un nuevo archivo R Markdown:
    • Documento HTML
    • Título: “Análisis de datos con dplyr”
    • Contenido: Según las notas que tomes en la sesión

Hemos aprendido a crear tibbles y data.frames. Lo siguiente es aprender a utilizarlos. De ahora en adelante, nuestros ejemplos sólo utilizarán tibbles y me referiré a ellos como “df”.

¿Qué es dplyr?

Es un paquete para R que nos permite trabajar con mayor facilidad nuestros datos tabulares. Para poder usar sus funciones, debemos cargar el paquete. Como forma parte de los paquetes del tidyverse, podemos cargar todos juntos a la vez.

# Para cargar sólo dplyr
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

# Para cargar todo el tidyverse
library(tidyverse)

En resumen, sus funciones nos permiten realizar las siguientes tareas:

  • Filtrar observaciones de acuerdo a sus valores con filter().
  • Organizar las filas de acuerdo a sus valores con arrange().
  • Seleccionar variables por su nombre con select().
  • Modificar las variables de nuestro conjunto de datos con mutate().
  • Resumir nuestros datos en valores representativos con summarise().
  • Agrupar nuestros datos para operar en ellos con group_by().

Usaremos como ejemplo el dataset “gapminder.xlsx”.

library(readxl)

gapminder <- read_xlsx("data/gapminder.xlsx")

Contiene información de la expectativa de vida (lifeExp), población (pop) y el PBI per cápita (gdpPercap) de 142 países de 1952 a 2007.

gapminder
## # A tibble: 1,704 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Afghanistan Asia       1972    36.1 13079460      740.
##  6 Afghanistan Asia       1977    38.4 14880372      786.
##  7 Afghanistan Asia       1982    39.9 12881816      978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.
##  9 Afghanistan Asia       1992    41.7 16317921      649.
## 10 Afghanistan Asia       1997    41.8 22227415      635.
## # ... with 1,694 more rows

filter()

La función filter() nos simplifica la tarea de hacer subsetting. Podemos elegir obtener sólo la información referida a Perú por ejemplo. El primer argumento de filter() es el df que queremos filtrar, y los siguientes argumentos son las pruebas lógicas que le queremos aplicar.

filter(gapminder, country == "Peru")

## # A tibble: 12 x 6
##    country continent  year lifeExp      pop gdpPercap
##    <chr>   <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Peru    Americas   1952    43.9  8025700     3759.
##  2 Peru    Americas   1957    46.3  9146100     4245.
##  3 Peru    Americas   1962    49.1 10516500     4957.
##  4 Peru    Americas   1967    51.4 12132200     5788.
##  5 Peru    Americas   1972    55.4 13954700     5938.
##  6 Peru    Americas   1977    58.4 15990099     6281.
##  7 Peru    Americas   1982    61.4 18125129     6435.
##  8 Peru    Americas   1987    64.1 20195924     6361.
##  9 Peru    Americas   1992    66.5 22430449     4446.
## 10 Peru    Americas   1997    68.4 24748122     5838.
## 11 Peru    Americas   2002    69.9 26769436     5909.
## 12 Peru    Americas   2007    71.4 28674757     7409.

Dentro de filter(), R entiende que country se refiere a la columna country del df gapminder y sólo filtra aquellos elementos dentro de esa columna que son iguales a "Peru".

Es posible añadir más de una condición. Supongamos que queremos la información de Perú, pero sólo a partir del año 1992.

filter(gapminder, country == "Peru", year >= 1992)

## # A tibble: 4 x 6
##   country continent  year lifeExp      pop gdpPercap
##   <chr>   <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 Peru    Americas   1992    66.5 22430449     4446.
## 2 Peru    Americas   1997    68.4 24748122     5838.
## 3 Peru    Americas   2002    69.9 26769436     5909.
## 4 Peru    Americas   2007    71.4 28674757     7409.

Añadir una nueva prueba lógica funciona igual que utilizar el operador &. Evidentemente, aún podemos utilizar otros operadores lógicos. Supongamos que queremos obtener la data a partir de 1992 para Perú y Chile.

filter(gapminder, 
       country == "Peru" | country == "Chile", 
       year >= 1992)

## # A tibble: 8 x 6
##   country continent  year lifeExp      pop gdpPercap
##   <chr>   <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 Chile   Americas   1992    74.1 13572994     7596.
## 2 Chile   Americas   1997    75.8 14599929    10118.
## 3 Chile   Americas   2002    77.9 15497046    10779.
## 4 Chile   Americas   2007    78.6 16284741    13172.
## 5 Peru    Americas   1992    66.5 22430449     4446.
## 6 Peru    Americas   1997    68.4 24748122     5838.
## 7 Peru    Americas   2002    69.9 26769436     5909.
## 8 Peru    Americas   2007    71.4 28674757     7409.

Si quiero obtener la información de varios países, puedo ahorrarme algo de tipeo usando %in% dentro de filter(). Esta vez le pediré los datos a partir del 2002. Guardaré este subset para usarlo más adelante.

gapminder_subset <- filter(gapminder, 
       country %in% c("Peru", "Chile", "Colombia", "Ecuador"),
       year >= 2002)

gapminder_subset
## # A tibble: 8 x 6
##   country  continent  year lifeExp      pop gdpPercap
##   <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 Chile    Americas   2002    77.9 15497046    10779.
## 2 Chile    Americas   2007    78.6 16284741    13172.
## 3 Colombia Americas   2002    71.7 41008227     5755.
## 4 Colombia Americas   2007    72.9 44227550     7007.
## 5 Ecuador  Americas   2002    74.2 12921234     5773.
## 6 Ecuador  Americas   2007    75.0 13755680     6873.
## 7 Peru     Americas   2002    69.9 26769436     5909.
## 8 Peru     Americas   2007    71.4 28674757     7409.

Ejercicio 1

Usando gapminder, filtra los datos de países miembros permanentes del consejo de seguridad de la ONU para los años entre 1957 y 2007

  • Países: “United States”, “United Kingdom”, “France”, “China”. (Rusia no está presente en gapminder)

Ejercicio 2

Usando gapminder, filtra los datos de países de África y Asia para el año 1997.

  • ¿Cuántos observaciones obtienes?

select()

La función select() nos permite seleccionar columnas específicas de nuestro df. Supongamos que sólo queremos los nombres de los países, el año y el total de población. Podemos hacerlo con select().

Sólo hace falta indicar como argumentos de select() el nombre de las variables a escoger.

select(gapminder_subset, country, year, pop)

## # A tibble: 8 x 3
##   country   year      pop
##   <chr>    <dbl>    <dbl>
## 1 Chile     2002 15497046
## 2 Chile     2007 16284741
## 3 Colombia  2002 41008227
## 4 Colombia  2007 44227550
## 5 Ecuador   2002 12921234
## 6 Ecuador   2007 13755680
## 7 Peru      2002 26769436
## 8 Peru      2007 28674757

Además de eso select nos permite cambiar en el momento el nombre de nuestras variables.

select(gapminder_subset, 
       pais = country, 
       año =year, 
       poblacion = pop)

## # A tibble: 8 x 3
##   pais       año poblacion
##   <chr>    <dbl>     <dbl>
## 1 Chile     2002  15497046
## 2 Chile     2007  16284741
## 3 Colombia  2002  41008227
## 4 Colombia  2007  44227550
## 5 Ecuador   2002  12921234
## 6 Ecuador   2007  13755680
## 7 Peru      2002  26769436
## 8 Peru      2007  28674757

Si lo que deseo es excluir una variable, debo anteponerle un signo negativo.

select(gapminder_subset, -continent)

## # A tibble: 8 x 5
##   country   year lifeExp      pop gdpPercap
##   <chr>    <dbl>   <dbl>    <dbl>     <dbl>
## 1 Chile     2002    77.9 15497046    10779.
## 2 Chile     2007    78.6 16284741    13172.
## 3 Colombia  2002    71.7 41008227     5755.
## 4 Colombia  2007    72.9 44227550     7007.
## 5 Ecuador   2002    74.2 12921234     5773.
## 6 Ecuador   2007    75.0 13755680     6873.
## 7 Peru      2002    69.9 26769436     5909.
## 8 Peru      2007    71.4 28674757     7409.

Si deseo excluir más de una variable, puedo anteponerle un signo negativo a un vector con los nombres deseados.

select(gapminder_subset, -c(continent, pop, gdpPercap))

## # A tibble: 8 x 3
##   country   year lifeExp
##   <chr>    <dbl>   <dbl>
## 1 Chile     2002    77.9
## 2 Chile     2007    78.6
## 3 Colombia  2002    71.7
## 4 Colombia  2007    72.9
## 5 Ecuador   2002    74.2
## 6 Ecuador   2007    75.0
## 7 Peru      2002    69.9
## 8 Peru      2007    71.4

Ejercicio 1

Usando gapminder, selecciona las variables country, year y lifeExp.

Ejercicio 2

Usando gapminder, selecciona las variables country, year y pop. Esta vez traduce sus nombres

Ejercicio 3

Usando gapminder, selecciona todas las variables con excepción de lifeExp y gdpPercap.

arrange()

La utilidad de arrange() es que nos permite ordenar nuestros datos en base a las variables que escojamos. Recuerda nuestro subset de gapminder. Está ordenado por el orden alfabético de la columna country.

gapminder_subset
## # A tibble: 8 x 6
##   country  continent  year lifeExp      pop gdpPercap
##   <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 Chile    Americas   2002    77.9 15497046    10779.
## 2 Chile    Americas   2007    78.6 16284741    13172.
## 3 Colombia Americas   2002    71.7 41008227     5755.
## 4 Colombia Americas   2007    72.9 44227550     7007.
## 5 Ecuador  Americas   2002    74.2 12921234     5773.
## 6 Ecuador  Americas   2007    75.0 13755680     6873.
## 7 Peru     Americas   2002    69.9 26769436     5909.
## 8 Peru     Americas   2007    71.4 28674757     7409.

Podemos indicarle que se ordene por año.

arrange(gapminder_subset, year)
## # A tibble: 8 x 6
##   country  continent  year lifeExp      pop gdpPercap
##   <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 Chile    Americas   2002    77.9 15497046    10779.
## 2 Colombia Americas   2002    71.7 41008227     5755.
## 3 Ecuador  Americas   2002    74.2 12921234     5773.
## 4 Peru     Americas   2002    69.9 26769436     5909.
## 5 Chile    Americas   2007    78.6 16284741    13172.
## 6 Colombia Americas   2007    72.9 44227550     7007.
## 7 Ecuador  Americas   2007    75.0 13755680     6873.
## 8 Peru     Americas   2007    71.4 28674757     7409.

Ahora aparecen primero los datos del 2002 y luego los del 2007. Por defecto, el orden se hace en forma ascendente. Si uso la función desc() rodeando la columna elegida, ocurre lo contrario.

arrange(gapminder_subset, desc(year))
## # A tibble: 8 x 6
##   country  continent  year lifeExp      pop gdpPercap
##   <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 Chile    Americas   2007    78.6 16284741    13172.
## 2 Colombia Americas   2007    72.9 44227550     7007.
## 3 Ecuador  Americas   2007    75.0 13755680     6873.
## 4 Peru     Americas   2007    71.4 28674757     7409.
## 5 Chile    Americas   2002    77.9 15497046    10779.
## 6 Colombia Americas   2002    71.7 41008227     5755.
## 7 Ecuador  Americas   2002    74.2 12921234     5773.
## 8 Peru     Americas   2002    69.9 26769436     5909.

Puedo ordenar en base a más de una columna, sólo debo agregarla como otro argumento. Por ejemplo, si quiero ver el orden en las expectativas de vida por año.

arrange(gapminder_subset, year, lifeExp)
## # A tibble: 8 x 6
##   country  continent  year lifeExp      pop gdpPercap
##   <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 Peru     Americas   2002    69.9 26769436     5909.
## 2 Colombia Americas   2002    71.7 41008227     5755.
## 3 Ecuador  Americas   2002    74.2 12921234     5773.
## 4 Chile    Americas   2002    77.9 15497046    10779.
## 5 Peru     Americas   2007    71.4 28674757     7409.
## 6 Colombia Americas   2007    72.9 44227550     7007.
## 7 Ecuador  Americas   2007    75.0 13755680     6873.
## 8 Chile    Americas   2007    78.6 16284741    13172.

En ambos años, Perú tuvo la expectativa de vida más baja.

Ejercicio 1

Usando gapminder y la función arrange, determina cuál es el año más bajo

Ejercicio 2

Usando gapminder y la función arrange, determina cuál es fue la expectativa de vida más alta en el año más bajo

Ejercicio 3

Usando gapminder y la función arrange, determina cuál es fue la expectativa de vida más alta en el año más alto

mutate()

En muchas oportunidades, lo que voy a necesitar es crear nuevas variables. Para ello puedo utilizar mutate(). Por ejemplo, multiplicando los datos de población y PBI per cápita es posible para mí obtener el PBI total de un país.

mutate(gapminder_subset, 
       PBI_total = pop * gdpPercap)
## # A tibble: 8 x 7
##   country  continent  year lifeExp      pop gdpPercap     PBI_total
##   <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>         <dbl>
## 1 Chile    Americas   2002    77.9 15497046    10779. 167039309148.
## 2 Chile    Americas   2007    78.6 16284741    13172. 214496727218.
## 3 Colombia Americas   2002    71.7 41008227     5755. 236013006966.
## 4 Colombia Americas   2007    72.9 44227550     7007. 309883885810.
## 5 Ecuador  Americas   2002    74.2 12921234     5773.  74594859032.
## 6 Ecuador  Americas   2007    75.0 13755680     6873.  94546397113.
## 7 Peru     Americas   2002    69.9 26769436     5909. 158181134667.
## 8 Peru     Americas   2007    71.4 28674757     7409. 212448566598.

La operación realizada dentro de mutate() itera automáticamente a través de las filas de las variables seleccionadas para obtener el resultado. Es por ello que también es posible operar en ellas usando una constante.

mutate() además permite usar múltiples transformaciones en una sola llamada, incluso utilizando variables recién creadas.

mutate(gapminder_subset, 
       PBI_total = pop * gdpPercap,
       PBI_total_texto = paste("PBI de",country,"en",year,":",PBI_total,"dólares")
       )
## # A tibble: 8 x 8
##   country  continent  year lifeExp    pop gdpPercap PBI_total PBI_total_texto   
##   <chr>    <chr>     <dbl>   <dbl>  <dbl>     <dbl>     <dbl> <chr>             
## 1 Chile    Americas   2002    77.9 1.55e7    10779.   1.67e11 PBI de Chile en 2~
## 2 Chile    Americas   2007    78.6 1.63e7    13172.   2.14e11 PBI de Chile en 2~
## 3 Colombia Americas   2002    71.7 4.10e7     5755.   2.36e11 PBI de Colombia e~
## 4 Colombia Americas   2007    72.9 4.42e7     7007.   3.10e11 PBI de Colombia e~
## 5 Ecuador  Americas   2002    74.2 1.29e7     5773.   7.46e10 PBI de Ecuador en~
## 6 Ecuador  Americas   2007    75.0 1.38e7     6873.   9.45e10 PBI de Ecuador en~
## 7 Peru     Americas   2002    69.9 2.68e7     5909.   1.58e11 PBI de Peru en 20~
## 8 Peru     Americas   2007    71.4 2.87e7     7409.   2.12e11 PBI de Peru en 20~

También es posible sobreescribir los valores de mis columnas, basta con ponerle el mismo nombre a la transformación

mutate(gapminder_subset,
       gdpPercap = round(gdpPercap, digits = 1)
       )
## # A tibble: 8 x 6
##   country  continent  year lifeExp      pop gdpPercap
##   <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 Chile    Americas   2002    77.9 15497046    10779.
## 2 Chile    Americas   2007    78.6 16284741    13172.
## 3 Colombia Americas   2002    71.7 41008227     5755.
## 4 Colombia Americas   2007    72.9 44227550     7007.
## 5 Ecuador  Americas   2002    74.2 12921234     5773 
## 6 Ecuador  Americas   2007    75.0 13755680     6873.
## 7 Peru     Americas   2002    69.9 26769436     5909 
## 8 Peru     Americas   2007    71.4 28674757     7409.

Ejercicio 1

Usando gapminder y las funciones filter() y mutate(), determina el PBI de China y United States en los años 1952 y 2007.

summarise()

Lo siguiente a aprender es el uso de summarise(). Es una función que nos permite obtener datos resumen de nuestras variables. Algo a tener en cuenta es que al hacer nuestro df sólo retendrá los datos de resumen, obviando la data de la cual fueron obtenidos. Los ejemplos dejarán esto más claro.

Por ejemplo, podemos obtener el recuento de observaciones de nuestra tabla si usamos n(). En el mismo código podemos asignarle un nombre a la columna, en este caso le ponemos recuento.

summarise(gapminder_subset, recuento = n())
## # A tibble: 1 x 1
##   recuento
##      <int>
## 1        8

Podemos obtener cualquier otro tipo de resumen, por ejemplo, el promedio de expectativa de vida para el periodo escogido. Llamaremos promedio a esta columna.

summarise(gapminder_subset, promedio = mean(lifeExp))
## # A tibble: 1 x 1
##   promedio
##      <dbl>
## 1     73.9

Naturalmente, es posible crear más de una variable resumen al mismo tiempo, incluso es posible crearla en referencia a una creada previamente en el mismo código.

summarise(gapminder_subset, 
          recuento = n(),
          promedio = mean(lifeExp),
          resumen = paste("La expectativa de vida de las", 
                          recuento,
                          "observaciones es",
                          promedio))
## # A tibble: 1 x 3
##   recuento promedio resumen                                                  
##      <int>    <dbl> <chr>                                                    
## 1        8     73.9 La expectativa de vida de las 8 observaciones es 73.93475

Ejercicio 1

Usando gapminder, la función filter() y summarise() determina el promedio de la expectativa de vida para Asia, Africa y Oceania en 1952.

group_by()

Existe una gran cantidad de datos de resumen que se pueden obtener en nuestro análisis, pero no siempre vamos a querer que los datos sean generales. En la siguiente sección aprenderas a resumir datos agrupados.

La función group_by() nos permite seleccionar variables para agruparlas y obtener datos de resumen diferenciados. Aunque es posible utilizarla en conjunto con otras funciones de dplyr(), usarla junto con summarise() nos demuestra claramente su poder.

Podemos obtener el recuento de observaciones por país si primero agrupamos nuestros datos.

gapminder_subset <- group_by(gapminder_subset, country)

summarise(gapminder_subset, recuento = n())
## # A tibble: 4 x 2
##   country  recuento
##   <chr>       <int>
## 1 Chile           2
## 2 Colombia        2
## 3 Ecuador         2
## 4 Peru            2

Ten en cuenta que los datos permanecerán agrupados hasta que le indiquemos al df que se debe desagrupar, a través de ungroup().

gapminder_subset <- ungroup(gapminder_subset)

Del mismo modo, podemos obtener el promedio de expectativa de vida, pero esta vez diferenciado por país.

gapminder_subset <- group_by(gapminder_subset, country)

summarise(gapminder_subset, promedio = mean(lifeExp))
## # A tibble: 4 x 2
##   country  promedio
##   <chr>       <dbl>
## 1 Chile        78.2
## 2 Colombia     72.3
## 3 Ecuador      74.6
## 4 Peru         70.7

No olvides desagrupar tus datos.

gapminder_subset <- ungroup(gapminder_subset)

Ejercicio 1

Usando gapminder, la función group_by() y summarise() determina el promedio de la expectativa de vida para todos los continentes en 1952.

Ejercicio 2

Usando gapminder, la función group_by() y summarise() determina el promedio de la población y del PBI per cápita para todos los continentes en 2007.

Descanso de 15 minutos

Operador pipe

Primer argumento de las funciones

Es importante notar una característica común entre todas las funciones de dplyr() que hemos conocido: el primer argumento siempre es el df al que se le va a aplicar la transformación. Esta es una característica consistente con todos los paquetes del tidyverse, que permite tener un flujo de trabajo pipeable.

Ejemplos

filter(gapminder, country == "Peru")
select(gapminder, continent, year, pop)
arrange(gapminder, desc(gdpPercap))
mutate(gapminder, pbi_total = pop * gdpPercap)
summarise(gapminder, promedio_pbi = mean(gdpPercap))
group_by(gapminder, continent)
ungroup(gapminder)

Lo que esto quiere decir concretamente es que las funciones se pueden encadenar a través de un operador llamado pipe (%>%), cuyo valor en el lado izquierdo se convierte en el primer argumento de la función del lado derecho.

El paquete magrittr

El pipe fue diseñado originalmente en el paquete magrittr, que viene con algunas funciones pipeables que pueden reemplazar a los operadores aritméticos de R.

Esta sección tratará de ilustrar la utilidad del pipe en cualquier función, luego pasaremos a ver ejemplos específicos con dplyr.

library(magrittr)

original magrittr
5 + 3 add(5, 3)
10 - 5 subtract(10, 5)
2 * 10 multiply_by(2, 10)
100/10 divide_by(100, 10)

Representando operaciones con magrittr

100 + 50
## [1] 150
add(100, 50)
## [1] 150

(20 + 30) * 10
## [1] 500
multiply_by(add(20, 30), 10)
## [1] 500

(10 - 5) / 5
## [1] 1
divide_by(subtract(10, 5), 5)
## [1] 1

Ejercicio

Representa esta operación usando las funciones de magrittr.

(((12 * 5) - 11)/ 7) + 3
## [1] 10

Las funciones como secuencia

Piensa nuevamente en esta operación:

(((12 * 5) - 11)/ 7) + 3

Para obtener el resultado, se realizan una serie de pasos:

  1. Tomamos inicialmente el número 12
  2. Luego, se le multiplica por 5
  3. Luego, al resultado, se le resta 11
  4. Luego, al resultado, se le divide entre 7
  5. Luego, al resultado, se le suma 3

Usando las funciones de magrittr, tenemos tres maneras de representar esta secuencia.

1. Funciones anidadas

Llamar las funciones dentro de las otras funciones. Nótese que la primera operación va en el nivel más profundo, empezando desde el 12.

add(divide_by(subtract(multiply_by(12, 5), 11), 7), 3)
## [1] 10

Si quisiéramos que cada función ocupe su propia línea, podemos hacerlo de esta manera:

add(
  divide_by(
    subtract(
      multiply_by(12, 
                  5), 
      11), 
    7), 
  3)
## [1] 10

Aunque esto nos permite entender la secuencia de adentro hacia afuera no necesariamente favorece su lectura

2. Secuencia de objetos intermedios

Esto parece más entendible y al leerlo se sigue la estructura de pasos descritos anteriormente. Vemos que al igual que con las funciones de dplyr, las funciones de magrittr siempre tienen el mismo primer argumento: el objeto a transformar.

numero_inicial <- 12
resultado1 <- multiply_by(numero_inicial, 5)
resultado2 <- subtract(resultado1, 11)
resultado3 <- divide_by(resultado2, 7)
resultado_final <- add(resultado3, 3)
resultado_final
## [1] 10

Si no deseo ir asignando nombres nuevos, puedo ir sobreescribiendo el valor de mi objeto en cada paso. De esta manera se ve más claro que el primer argumento de cada función depende del paso anterior.

numero <- 12
numero <- multiply_by(numero, 5)
numero <- subtract(numero, 11)
numero <- divide_by(numero, 7)
numero <- add(numero, 3)
numero
## [1] 10

Funciones encadenadas con pipe

Si uso pipes (%>%) no necesito crear objetos intermedios y el operador puede leerse como luego. Tomo el 12, luego multiplico por 5, luego resto 11, luego divido entre 7, luego aumento 3.

12 %>% 
  multiply_by(5) %>% 
  subtract(11) %>% 
  divide_by(7) %>% 
  add(3)
## [1] 10

Hemos conseguido el mismo resultado de tres maneras distintas, pero usando pipes hemos encadenado varias funciones una tras otra sin sacrificar la legibilidad de nuestro código ni llenar el Environment de objetos innecesarios.

Ejercicio

Representa las siguientes operaciones usando pipes

(((10 + 30) * 3) / 12) - 5
## [1] 5
(((7 - 3) / 2) + 3) * 20
## [1] 100

Usar pipes con las funciones de dplyr

Una vez entendido el uso de pipes, podemos aplicarlo a nuestro análisis de datos. Seguimos trabajando con gapminder.

gapminder
## # A tibble: 1,704 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Afghanistan Asia       1972    36.1 13079460      740.
##  6 Afghanistan Asia       1977    38.4 14880372      786.
##  7 Afghanistan Asia       1982    39.9 12881816      978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.
##  9 Afghanistan Asia       1992    41.7 16317921      649.
## 10 Afghanistan Asia       1997    41.8 22227415      635.
## # ... with 1,694 more rows

En gapminder tengo todo lo necesario para obtener el ranking del promedio del PBI nacional para cada uno de los cinco continentes en los años 1987 y 2007 (esto me permitirá comparar los cambios en la economía mundial en esos treinta años).

Para ello voy a requerir usar todas las funciones de dplyr que he aprendido hasta el momento. Primero lo haremos paso por paso y luego convertiremos todo en el flujo de unos cuantos pipes.

Como quiero mostrar el resultado de cada paso realizado, rodeo la asignación de mi objeto con paréntesis

Debido a que sólo necesito los años 1987 y 2007, filtro mis datos. Al objeto modificado lo llamaré gapminder_modificado.

(gapminder_modificado <- filter(gapminder, year %in% c(1987, 2007)) )
## # A tibble: 284 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Afghanistan Asia       1987    40.8 13867957      852.
##  2 Afghanistan Asia       2007    43.8 31889923      975.
##  3 Albania     Europe     1987    72    3075321     3739.
##  4 Albania     Europe     2007    76.4  3600523     5937.
##  5 Algeria     Africa     1987    65.8 23254956     5681.
##  6 Algeria     Africa     2007    72.3 33333216     6223.
##  7 Angola      Africa     1987    39.9  7874230     2430.
##  8 Angola      Africa     2007    42.7 12420476     4797.
##  9 Argentina   Americas   1987    70.8 31620918     9140.
## 10 Argentina   Americas   2007    75.3 40301927    12779.
## # ... with 274 more rows

El siguiente paso es quedarme sólo con las variables que necesito. En este caso son continente, año, PBI per cápita y población.

(gapminder_modificado <- select(gapminder_modificado, 
                               continent, year, gdpPercap, pop) )
## # A tibble: 284 x 4
##    continent  year gdpPercap      pop
##    <chr>     <dbl>     <dbl>    <dbl>
##  1 Asia       1987      852. 13867957
##  2 Asia       2007      975. 31889923
##  3 Europe     1987     3739.  3075321
##  4 Europe     2007     5937.  3600523
##  5 Africa     1987     5681. 23254956
##  6 Africa     2007     6223. 33333216
##  7 Africa     1987     2430.  7874230
##  8 Africa     2007     4797. 12420476
##  9 Americas   1987     9140. 31620918
## 10 Americas   2007    12779. 40301927
## # ... with 274 more rows

A continuación, debo obtener el PBI nacional multiplicando el PBI per cápita por la población.

(gapminder_modificado <- mutate(gapminder_modificado,
                               PBI_nacional = pop * gdpPercap) )
## # A tibble: 284 x 5
##    continent  year gdpPercap      pop  PBI_nacional
##    <chr>     <dbl>     <dbl>    <dbl>         <dbl>
##  1 Asia       1987      852. 13867957  11820990309.
##  2 Asia       2007      975. 31889923  31079291949.
##  3 Europe     1987     3739.  3075321  11498418358.
##  4 Europe     2007     5937.  3600523  21376411360.
##  5 Africa     1987     5681. 23254956 132119742845.
##  6 Africa     2007     6223. 33333216 207444851958.
##  7 Africa     1987     2430.  7874230  19136019189.
##  8 Africa     2007     4797. 12420476  59583895818.
##  9 Americas   1987     9140. 31620918 289004799539.
## 10 Americas   2007    12779. 40301927 515033625357.
## # ... with 274 more rows

Ahora que tengo el PBI nacional, puedo obtener el promedio por año y continente.

gapminder_modificado <- group_by(gapminder_modificado, continent, year)
gapminder_modificado <- summarise(gapminder_modificado, promedio = mean(PBI_nacional))
(gapminder_modificado <- ungroup(gapminder_modificado) )
## # A tibble: 10 x 3
##    continent  year      promedio
##    <chr>     <dbl>         <dbl>
##  1 Africa     1987  24107264108.
##  2 Africa     2007  45778570846.
##  3 Americas   1987 439447790357.
##  4 Americas   2007 776723426068.
##  5 Asia       1987 241784763369.
##  6 Asia       2007 627513635079.
##  7 Europe     1987 316507473546.
##  8 Europe     2007 493183311052.
##  9 Oceania    1987 209451563998.
## 10 Oceania    2007 403657044512.

Ahora sólo me falta ordenar mis datos de manera descendente según el promedio del PBI.

(gapminder_modificado <- arrange(gapminder_modificado, year, desc(promedio)) )
## # A tibble: 10 x 3
##    continent  year      promedio
##    <chr>     <dbl>         <dbl>
##  1 Americas   1987 439447790357.
##  2 Europe     1987 316507473546.
##  3 Asia       1987 241784763369.
##  4 Oceania    1987 209451563998.
##  5 Africa     1987  24107264108.
##  6 Americas   2007 776723426068.
##  7 Asia       2007 627513635079.
##  8 Europe     2007 493183311052.
##  9 Oceania    2007 403657044512.
## 10 Africa     2007  45778570846.

Listo. Con el flujo de análisis terminado, puedo verificar que en esos treinta años, Asia superó a Europa en el promedio de su PBI nacional.

Podría juntar todos estos pasos en un solo bloque para que quede claro lo que sucedió.

gapminder_modificado <- filter(gapminder, year %in% c(1987, 2007)) 

gapminder_modificado <- select(gapminder_modificado, continent, year, gdpPercap, pop)

gapminder_modificado <- mutate(gapminder_modificado, PBI_nacional = pop * gdpPercap)

gapminder_modificado <- group_by(gapminder_modificado, continent, year)

gapminder_modificado <- summarise(gapminder_modificado, promedio = mean(PBI_nacional))

gapminder_modificado <- ungroup(gapminder_modificado)

gapminder_modificado <- arrange(gapminder_modificado, year, desc(promedio))

Reescribiendo el flujo con pipes

Podemos hacer todo el análisis usando pipes.

gapminder %>% 
  filter(year %in% c(1987, 2007)) %>%
  select(continent, year, gdpPercap, pop) %>% 
  mutate(PBI_nacional = pop * gdpPercap) %>% 
  group_by(continent, year) %>% 
  summarise(promedio = mean(PBI_nacional)) %>% 
  ungroup() %>% 
  arrange(year, desc(promedio))
## # A tibble: 10 x 3
##    continent  year      promedio
##    <chr>     <dbl>         <dbl>
##  1 Americas   1987 439447790357.
##  2 Europe     1987 316507473546.
##  3 Asia       1987 241784763369.
##  4 Oceania    1987 209451563998.
##  5 Africa     1987  24107264108.
##  6 Americas   2007 776723426068.
##  7 Asia       2007 627513635079.
##  8 Europe     2007 493183311052.
##  9 Oceania    2007 403657044512.
## 10 Africa     2007  45778570846.

Hemos obtenido el mismo resultado escribiendo mucho menos código y sin crear ningún objeto intermedio.

Ejercicio 1

Utilizando gapminder y las funciones de dplyr, obtén el ranking del PBI nacional de Perú, México, Colombia y Chile en los años 1967, 1987 y 2007.

Guíate de esta secuencia:

  1. Usar gapminder
  2. Filtrar los datos de los cuatro países y los años seleccionados
  3. Seleccionar las variables pais, población y pbi per cápita
  4. Calcular el pbi total para cada observación
  5. Agrupar las observaciones por año
  6. Organizar por valor de pbi total en orden descendente
  7. Desagrupar las observaciones

Ejercicio 2

Realiza un análisis que permita responder a la pregunta:

¿Qué continentes tuvieron la mejor y peor expectativa de vida mediana en 1992?

Ejercicio 3

Realiza un análisis que permita responder a la pregunta:

¿Qué continente tuvo el mayor porcentaje de países con expectativa de vida superior a la mediana mundial en 2007?