Crear un nuevo proyecto en nuevo directorio: “repaso-rbasico”
Te comparten el conjunto de datos “gapminder.xlsx”. Necesitas importar el conjunto de datos y contestar algunas preguntas.
Publicar en Rpubs.com el resultado de hacerle Knit al documento.
Generar un tibble de tres (3) observaciones con las siguientes columnas:
Ver ejemplo en la siguiente lámina
| deporte | jugadores | limite_tiempo | duracion |
|---|---|---|---|
| Baloncesto | 10 | TRUE | 48 |
| Ajedrez | 2 | FALSE | NA |
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
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”.
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:
filter().arrange().select().mutate().summarise().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
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.
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
Usando gapminder, filtra los datos de países de África y Asia para el año 1997.
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.
Usando gapminder, selecciona las variables country, year y pop. Esta vez traduce sus nombres
Usando gapminder, selecciona todas las variables con excepción de lifeExp y gdpPercap.
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.
Usando gapminder y la función arrange, determina cuál es el año más bajo
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
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
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.
Usando gapminder y las funciones filter() y mutate(), determina el PBI de China y United States en los años 1952 y 2007.
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
Usando gapminder, la función filter() y summarise() determina el promedio de la expectativa de vida para Asia, Africa y Oceania en 1952.
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)
Usando gapminder, la función group_by() y summarise() determina el promedio de la expectativa de vida para todos los continentes en 1952.
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.
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.
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 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) |
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
Representa esta operación usando las funciones de magrittr.
(((12 * 5) - 11)/ 7) + 3
## [1] 10
Piensa nuevamente en esta operación:
(((12 * 5) - 11)/ 7) + 3
Para obtener el resultado, se realizan una serie de pasos:
Usando las funciones de magrittr, tenemos tres maneras de representar esta secuencia.
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
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.
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.
Representa las siguientes operaciones usando pipes
(((10 + 30) * 3) / 12) - 5
## [1] 5
(((7 - 3) / 2) + 3) * 20
## [1] 100
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))
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.
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:
Realiza un análisis que permita responder a la pregunta:
¿Qué continentes tuvieron la mejor y peor expectativa de vida mediana en 1992?
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?