¿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 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:
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.
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
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.
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
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
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
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
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.
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
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
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
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.
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
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
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.
library(magrittr)
##
## Attaching package: 'magrittr'
## The following object is masked from 'package:purrr':
##
## set_names
## The following object is masked from 'package:tidyr':
##
## extract
(((12 * 5) - 11)/7) + 3
add() substrat() multiply_by() divide_by()
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
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
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
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