¿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.

Cargar paquete

# Para cargar solo 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

Esto me permite cargar varos paquetes a la vez

# Para cargar todo tidyverse
library (tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.3     ✓ purrr   0.3.4
## ✓ tibble  3.1.1     ✓ stringr 1.4.0
## ✓ tidyr   1.1.3     ✓ forcats 0.5.1
## ✓ readr   1.4.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

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

Cargar datos

library(readxl)
gapminder <- read_xlsx("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.

Insepccionando la data

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

FUNCIONES

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.

Reciclaje de la constante: Testeando igualdad en el vector country con la constante Ecuador.

filter(gapminder,country == "Ecuador") 
## # A tibble: 12 x 6
##    country continent  year lifeExp      pop gdpPercap
##    <chr>   <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Ecuador Americas   1952    48.4  3548753     3522.
##  2 Ecuador Americas   1957    51.4  4058385     3781.
##  3 Ecuador Americas   1962    54.6  4681707     4086.
##  4 Ecuador Americas   1967    56.7  5432424     4579.
##  5 Ecuador Americas   1972    58.8  6298651     5281.
##  6 Ecuador Americas   1977    61.3  7278866     6680.
##  7 Ecuador Americas   1982    64.3  8365850     7214.
##  8 Ecuador Americas   1987    67.2  9545158     6482.
##  9 Ecuador Americas   1992    69.6 10748394     7104.
## 10 Ecuador Americas   1997    72.3 11911819     7429.
## 11 Ecuador Americas   2002    74.2 12921234     5773.
## 12 Ecuador Americas   2007    75.0 13755680     6873.

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.

O logico para varias funciones

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.

filter(gapminder, 
       country %in% c("Peru", "Chile", "Colombia", "Ecuador"),
       year >= 2002)
## # 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.
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)

paises_permanentes <- filter(gapminder, 
       country %in% c("United States", "United Kingdom", "France", "China"),
       year >= 1957, year <= 2007)
paises_permanentes
## # A tibble: 44 x 6
##    country continent  year lifeExp        pop gdpPercap
##    <chr>   <chr>     <dbl>   <dbl>      <dbl>     <dbl>
##  1 China   Asia       1957    50.5  637408000      576.
##  2 China   Asia       1962    44.5  665770000      488.
##  3 China   Asia       1967    58.4  754550000      613.
##  4 China   Asia       1972    63.1  862030000      677.
##  5 China   Asia       1977    64.0  943455000      741.
##  6 China   Asia       1982    65.5 1000281000      962.
##  7 China   Asia       1987    67.3 1084035000     1379.
##  8 China   Asia       1992    68.7 1164970000     1656.
##  9 China   Asia       1997    70.4 1230075000     2289.
## 10 China   Asia       2002    72.0 1280400000     3119.
## # … with 34 more rows

Ejercicio 2

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

continentes <- filter(gapminder, 
       continent %in% c("Africa", "Asia"),
       year == 1997)
continentes
## # A tibble: 85 x 6
##    country      continent  year lifeExp       pop gdpPercap
##    <chr>        <chr>     <dbl>   <dbl>     <dbl>     <dbl>
##  1 Afghanistan  Asia       1997    41.8  22227415      635.
##  2 Algeria      Africa     1997    69.2  29072015     4797.
##  3 Angola       Africa     1997    41.0   9875024     2277.
##  4 Bahrain      Asia       1997    73.9    598561    20292.
##  5 Bangladesh   Asia       1997    59.4 123315288      973.
##  6 Benin        Africa     1997    54.8   6066080     1233.
##  7 Botswana     Africa     1997    52.6   1536536     8647.
##  8 Burkina Faso Africa     1997    50.3  10352843      946.
##  9 Burundi      Africa     1997    45.3   6121610      463.
## 10 Cambodia     Asia       1997    56.5  11782962      734.
## # … with 75 more rows

¿Cuántos observaciones obtienes? 85 observaciones y 6 variables

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.

Nombres

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

Ejercio 1

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

select(gapminder, country, year, lifeExp)
## # A tibble: 1,704 x 3
##    country      year lifeExp
##    <chr>       <dbl>   <dbl>
##  1 Afghanistan  1952    28.8
##  2 Afghanistan  1957    30.3
##  3 Afghanistan  1962    32.0
##  4 Afghanistan  1967    34.0
##  5 Afghanistan  1972    36.1
##  6 Afghanistan  1977    38.4
##  7 Afghanistan  1982    39.9
##  8 Afghanistan  1987    40.8
##  9 Afghanistan  1992    41.7
## 10 Afghanistan  1997    41.8
## # … with 1,694 more rows

Ejercio 2

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

select(gapminder, 
       pais = country, 
       año =year, 
       poblacion = pop)
## # A tibble: 1,704 x 3
##    pais          año poblacion
##    <chr>       <dbl>     <dbl>
##  1 Afghanistan  1952   8425333
##  2 Afghanistan  1957   9240934
##  3 Afghanistan  1962  10267083
##  4 Afghanistan  1967  11537966
##  5 Afghanistan  1972  13079460
##  6 Afghanistan  1977  14880372
##  7 Afghanistan  1982  12881816
##  8 Afghanistan  1987  13867957
##  9 Afghanistan  1992  16317921
## 10 Afghanistan  1997  22227415
## # … with 1,694 more rows

Ejercio 3

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

select(gapminder, -c(lifeExp, gdpPercap))
## # A tibble: 1,704 x 4
##    country     continent  year      pop
##    <chr>       <chr>     <dbl>    <dbl>
##  1 Afghanistan Asia       1952  8425333
##  2 Afghanistan Asia       1957  9240934
##  3 Afghanistan Asia       1962 10267083
##  4 Afghanistan Asia       1967 11537966
##  5 Afghanistan Asia       1972 13079460
##  6 Afghanistan Asia       1977 14880372
##  7 Afghanistan Asia       1982 12881816
##  8 Afghanistan Asia       1987 13867957
##  9 Afghanistan Asia       1992 16317921
## 10 Afghanistan Asia       1997 22227415
## # … with 1,694 more rows

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.

Ejercicio 1

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

arrange(gapminder,year)
## # 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 Albania     Europe     1952    55.2  1282697     1601.
##  3 Algeria     Africa     1952    43.1  9279525     2449.
##  4 Angola      Africa     1952    30.0  4232095     3521.
##  5 Argentina   Americas   1952    62.5 17876956     5911.
##  6 Australia   Oceania    1952    69.1  8691212    10040.
##  7 Austria     Europe     1952    66.8  6927772     6137.
##  8 Bahrain     Asia       1952    50.9   120447     9867.
##  9 Bangladesh  Asia       1952    37.5 46886859      684.
## 10 Belgium     Europe     1952    68    8730405     8343.
## # … with 1,694 more rows

Year: 1952

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: Noruega con 72.6 años

arrange(gapminder,year, desc(lifeExp))
## # A tibble: 1,704 x 6
##    country        continent  year lifeExp      pop gdpPercap
##    <chr>          <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Norway         Europe     1952    72.7  3327728    10095.
##  2 Iceland        Europe     1952    72.5   147962     7268.
##  3 Netherlands    Europe     1952    72.1 10381988     8942.
##  4 Sweden         Europe     1952    71.9  7124673     8528.
##  5 Denmark        Europe     1952    70.8  4334000     9692.
##  6 Switzerland    Europe     1952    69.6  4815000    14734.
##  7 New Zealand    Oceania    1952    69.4  1994794    10557.
##  8 United Kingdom Europe     1952    69.2 50430000     9980.
##  9 Australia      Oceania    1952    69.1  8691212    10040.
## 10 Canada         Americas   1952    68.8 14785584    11367.
## # … with 1,694 more rows

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: Japón con 83 años en el año 2007

arrange(gapminder,desc(year), desc(lifeExp))
## # A tibble: 1,704 x 6
##    country          continent  year lifeExp       pop gdpPercap
##    <chr>            <chr>     <dbl>   <dbl>     <dbl>     <dbl>
##  1 Japan            Asia       2007    82.6 127467972    31656.
##  2 Hong Kong, China Asia       2007    82.2   6980412    39725.
##  3 Iceland          Europe     2007    81.8    301931    36181.
##  4 Switzerland      Europe     2007    81.7   7554661    37506.
##  5 Australia        Oceania    2007    81.2  20434176    34435.
##  6 Spain            Europe     2007    80.9  40448191    28821.
##  7 Sweden           Europe     2007    80.9   9031088    33860.
##  8 Israel           Asia       2007    80.7   6426679    25523.
##  9 France           Europe     2007    80.7  61083916    30470.
## 10 Canada           Americas   2007    80.7  33390141    36319.
## # … with 1,694 more rows

Arrange: datos concretos y se presentan datos de manera organizada

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.

mutate() además permite usar múltiples transformaciones en una sola llamada, incluso utilizando variables recién creadas.No solo valores de la columna sino constantes

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

mis_datos_filtrados <- filter(gapminder, 
       country %in% c("China", "United States"),
       year%in% c(1952,2007))
mis_datos_filtrados
## # A tibble: 4 x 6
##   country       continent  year lifeExp        pop gdpPercap
##   <chr>         <chr>     <dbl>   <dbl>      <dbl>     <dbl>
## 1 China         Asia       1952    44    556263527      400.
## 2 China         Asia       2007    73.0 1318683096     4959.
## 3 United States Americas   1952    68.4  157553000    13990.
## 4 United States Americas   2007    78.2  301139947    42952.
mutate(mis_datos_filtrados,PBI_nacional = pop * gdpPercap, PBI_nacional= as.character(PBI_nacional))
## # A tibble: 4 x 7
##   country       continent  year lifeExp        pop gdpPercap PBI_nacional    
##   <chr>         <chr>     <dbl>   <dbl>      <dbl>     <dbl> <chr>           
## 1 China         Asia       1952    44    556263527      400. 222754956737.111
## 2 China         Asia       2007    73.0 1318683096     4959. 6539500929092.31
## 3 United States Americas   1952    68.4  157553000    13990. 2204242423150.24
## 4 United States Americas   2007    78.2  301139947    42952. 12934458535085

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

Mutate: constante, summarise: por filas

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
mutate(gapminder_subset, promedio = mean(lifeExp), diferencia = lifeExp - promedio)
## # A tibble: 8 x 8
##   country  continent  year lifeExp      pop gdpPercap promedio diferencia
##   <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>    <dbl>      <dbl>
## 1 Chile    Americas   2002    77.9 15497046    10779.     73.9      3.93 
## 2 Chile    Americas   2007    78.6 16284741    13172.     73.9      4.62 
## 3 Colombia Americas   2002    71.7 41008227     5755.     73.9     -2.25 
## 4 Colombia Americas   2007    72.9 44227550     7007.     73.9     -1.05 
## 5 Ecuador  Americas   2002    74.2 12921234     5773.     73.9      0.238
## 6 Ecuador  Americas   2007    75.0 13755680     6873.     73.9      1.06 
## 7 Peru     Americas   2002    69.9 26769436     5909.     73.9     -4.03 
## 8 Peru     Americas   2007    71.4 28674757     7409.     73.9     -2.51

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.

datos_asia <- filter (gapminder, continent == "Asia", year == 1952)
datos_africa <- filter (gapminder, continent == "Africa", year == 1952)
datos_oceania <- filter (gapminder, continent == "Oceania", year == 1952)
summarise(datos_africa,promedio = mean(lifeExp))
## # A tibble: 1 x 1
##   promedio
##      <dbl>
## 1     39.1
summarise(datos_asia,promedio = mean(lifeExp))
## # A tibble: 1 x 1
##   promedio
##      <dbl>
## 1     46.3
summarise(datos_oceania,promedio = mean(lifeExp))
## # A tibble: 1 x 1
##   promedio
##      <dbl>
## 1     69.3

group_by()

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

gapminder_1952 <- filter(gapminder, year == 1952)
gapminder_1952 <- group_by(gapminder_1952,continent)
gapminder_1952
## # A tibble: 142 x 6
## # Groups:   continent [5]
##    country     continent  year lifeExp      pop gdpPercap
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Albania     Europe     1952    55.2  1282697     1601.
##  3 Algeria     Africa     1952    43.1  9279525     2449.
##  4 Angola      Africa     1952    30.0  4232095     3521.
##  5 Argentina   Americas   1952    62.5 17876956     5911.
##  6 Australia   Oceania    1952    69.1  8691212    10040.
##  7 Austria     Europe     1952    66.8  6927772     6137.
##  8 Bahrain     Asia       1952    50.9   120447     9867.
##  9 Bangladesh  Asia       1952    37.5 46886859      684.
## 10 Belgium     Europe     1952    68    8730405     8343.
## # … with 132 more rows
summarise(gapminder_1952, promedio = mean(lifeExp))
## # A tibble: 5 x 2
##   continent promedio
##   <chr>        <dbl>
## 1 Africa        39.1
## 2 Americas      53.3
## 3 Asia          46.3
## 4 Europe        64.4
## 5 Oceania       69.3
gapminder_1952 <- ungroup(gapminder_1952)
summarise(gapminder_1952, promedio = mean(lifeExp))
## # A tibble: 1 x 1
##   promedio
##      <dbl>
## 1     49.1

Lo más importante es que con datos agrupados nos da un solo promedio, pero con datos desagrupados nos muestra un promedio por cada observación

Operador Pipe

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.

install.packages (“magrittr”)

library(magrittr)
## 
## Attaching package: 'magrittr'
## The following object is masked from 'package:purrr':
## 
##     set_names
## The following object is masked from 'package:tidyr':
## 
##     extract

representar usando las funciones

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

add() substrat() multiply_by() divide_by()

  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
  1. 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

Usar pipes

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

12 %>% 
  multiply_by(5) %>% 
  subtract(11) %>% 
  divide_by(7) %>% 
  add(3)
## [1] 10
(((7-3)/-2)+3)*20
## [1] 20
7 %>% 
  subtract(3)%>%
  divide_by(-2)%>%
  add(3)%>%
  multiply_by(20)
## [1] 20

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
(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
(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
(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
gapminder_modificado <- group_by(gapminder_modificado, continent, year)
(gapminder_modificado <- ungroup(gapminder_modificado) )
## # 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
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))
## `summarise()` has grouped output by 'continent'. You can override using the `.groups` argument.
## # 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.

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:

Usar gapminder Filtrar los datos de los cuatro países y los años seleccionados Seleccionar las variables pais, población y pbi per cápita Calcular el pbi total para cada observación – Mutate da observacion para cada observación, summarize da resultado para todo el conjunto Agrupar las observaciones por año Organizar por valor de pbi total en orden descendente Desagrupar las observaciones

gapminder %>% 
  filter(country %in% c("Peru", "Mexico", "Colombia", "Chile")) %>%
  filter(year %in% c(1967, 1987, 2007)) %>%
  select(country, year, pop, gdpPercap) %>%
  mutate(PBI_nacional = pop * gdpPercap) %>% 
  group_by(year)%>% 
  arrange(year,desc(PBI_nacional))  %>%
  ungroup()
## # A tibble: 12 x 5
##    country   year       pop gdpPercap PBI_nacional
##    <chr>    <dbl>     <dbl>     <dbl>        <dbl>
##  1 Mexico    1967  47995559     5755.      2.76e11
##  2 Peru      1967  12132200     5788.      7.02e10
##  3 Colombia  1967  19764027     2679.      5.29e10
##  4 Chile     1967   8858908     5107.      4.52e10
##  5 Mexico    1987  80122492     8688.      6.96e11
##  6 Colombia  1987  30964245     4903.      1.52e11
##  7 Peru      1987  20195924     6361.      1.28e11
##  8 Chile     1987  12463354     5547.      6.91e10
##  9 Mexico    2007 108700891    11978.      1.30e12
## 10 Colombia  2007  44227550     7007.      3.10e11
## 11 Chile     2007  16284741    13172.      2.14e11
## 12 Peru      2007  28674757     7409.      2.12e11

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?

En 1992 el continente que tuvo la mejor expectativa de vida mediana fue oceania con 77 años a diferencia de africa que tiene la menor expectativa de vida con 52 años.

gapminder %>%
  filter(year == 1992)%>%
  select(continent, lifeExp)%>%
  group_by(continent)%>%
  summarise(mediana = median (lifeExp))%>%
  ungroup() %>%
  arrange(desc(mediana))
## # A tibble: 5 x 2
##   continent mediana
##   <chr>       <dbl>
## 1 Oceania      76.9
## 2 Europe       75.5
## 3 Americas     69.9
## 4 Asia         68.7
## 5 Africa       52.4

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?

gapminder %>%
  filter(year == 2007) %>%
  mutate(mediana_mundial = median(lifeExp), mayor_que_mediana = lifeExp > mediana_mundial) %>%
  group_by(continent) %>%
  summarise(n_paises = n(),
            n_paises_mayor_que_mediana = sum(mayor_que_mediana))  %>%
  ungroup()  %>%
  mutate(porcentaje_paises_mayores = n_paises_mayor_que_mediana/n_paises * 100) %>%
  arrange(desc(porcentaje_paises_mayores))
## # A tibble: 5 x 4
##   continent n_paises n_paises_mayor_que_mediana porcentaje_paises_mayores
##   <chr>        <int>                      <int>                     <dbl>
## 1 Oceania          2                          2                    100   
## 2 Europe          30                         29                     96.7 
## 3 Americas        25                         17                     68   
## 4 Asia            33                         18                     54.5 
## 5 Africa          52                          5                      9.62