library(tidyverse)
La fundación Gapminder es una organización sin fines de lucro con sede en Suecia que promueve el desarrollo global mediante el uso de estadísticas que pueden ayudar a reducir mitos comunes e historias sensacionalistas sobre la salud y la economía mundial. El fichero denominado “gapminder” proviene de esta fundación, y se descarga en el siguiente link.
gapminder_df <- read.csv(file = "https://personales.unican.es/rasillad/docencia/g2040/tema_1/datos/gapminder.csv",
sep=';',
header = TRUE,
stringsAsFactors = FALSE)
Este data frame cuenta con 6 columnas, cuyo nombre podemos obtenerlo de la siguiente manera:
colnames(gapminder_df)
## [1] "country" "continent" "year" "lifeExp" "pop" "gdpPercap"
Las variable son las siguientes:
country: Nombre de país
continent: Nombre del continente
year: año de la observación
lifeExp: expectativa de vida al nacer (en años)
pop: población
gdpPercap: Producto Interno Bruto (PIB) por habitante
Crea un código en R usando las funciones y sintaxis de
dplyr y ayudándote con pipes %>% para
reponder a las siguientes preguntas
● Selecciona la variable country.
gapminder_df %>%
select(country) # Seleccionamos solo la variable de país
● Selecciona las variables country and
continent en un nuevo dataframe denominado
borrame
borrame <- gapminder_df %>%
select(country, continent)
● Crea un dataframe denominado países que incluya sólo
el nombre de los países incluidos en el dataframe
borrame:
paises <- unique(borrame$country)
● ¿Cuál es el número de países en ese nuevo dataframe?
length(paises) # Length() nos devuelve la cantidad de elementos que tiene un vector
● ¿Y el número de continentes?
length(unique(borrame$continent)) # Podemos combinar las funciones
● Selecciona los datos correspondientes a España y crea con ellos un
dataframe denominado españa_df.
españa_df <- gapminder_df %>%
filter(country=="Spain")
● Elimina la columna correspondiente a la población
españa_df <- españa_df %>%
select(-pop)
● Muestra del dataframe españa_df los datos
correspondientes al año 2002?
españa_df %>%
filter(year == 2002) # Año 2002
● ¿Y qué datos de España existen, pero excluyendo el año 2007?
españa_df %>%
filter(!year == 2007) # ! representa la negación
● Y qué datos de España existen antes de los años 2002 o 2007
españa_df %>%
filter(year == 2002 | year == 2007)
# Alternativa
españa_df %>%
filter(year %in% c(2002,2007))
● Selecciona los datos correspondientes al continente americano,
desde el año 1982 (incluido) en adelante y crea con ellos un dataframe
denominado america_df. Ordena los datos de manera
descendente.
america_df <- gapminder_df %>%
filter(continent=="Americas", year >= 1982) %>%
arrange(desc(year))
● ¿Y si quisiéramos ordenar el dataframe america_df
según la esperanza de vida en 1982?
america_df %>%
filter(year == 1982) %>%
arrange(desc(lifeExp))
● Selecciona a partir de america_df las columnas
correspondientes a ingresos per capita y esperanza de vida
america_df %>%
select(lifeExp,gdpPercap)
● Volvemos al dataframe gapminder. Ordena en sentido
ascendente los países con mayor esperanza de vida en 1952
gapminder_df %>%
filter(year == 1952) %>% # Filtrar solo el año 1952
arrange(lifeExp) # Ordenar en sentido ascendente por esperanza de vida
● ¿Cuáles son los 7 países con mayor esperanza de vida en el año 2002?
gapminder_df %>%
filter(year==2002) %>%
arrange(desc(lifeExp)) %>%
head(7)
● ¿Cuáles son los 5 países con menor esperanza de vida y menor ingreso en el año 2002?
gapminder_df %>%
filter(year == 2002) %>%
arrange(lifeExp, gdpPercap) %>%
head(5)
● Los valores originales de población están calculados en miles de
habitantes. Crea un nuevo dataframe, denominado borrame con
la variable poblacióny transfórmala en millones de
personas
borrame <- gapminder_df %>%
mutate(pop = pop / 1000000) %>%
head(3)
● Calcula el PIB total de cada país, multiplicando el PIB por la población.
gapminder_df %>%
mutate(gdp = gdpPercap * pop)
● Crea en un nuevo dataframe llamado borrame una
variable denominada promedio_lifeExp resultado de calcular
el valor medio de la esperanza de vida según años y continentes
borrame <- gapminder_df %>%
group_by(year, continent) %>%
summarise(promedio_lifeExp = mean(lifeExp))
● Crea en un nuevo dataframe llamado borrame una
variable denominada dif_lifeExp resultado de sustraer a la
esperanza de vida en cada año y continente su promedio
borrame <- gapminder_df %>%
group_by(year, continent) %>%
mutate(dif_lifeExp = lifeExp - mean(lifeExp))
● Crea en un nuevo dataframe llamado borrame a partir de
los datos existentes del último año. Incluye en él 4 nuevas variables:
el valor del gdpPercap del país más pobre, el del país más rico, y el
nombre del país más pobre y el del país más rico.
gapminder_df %>%
group_by(year, continent) %>%
summarise(poor_country = min(gdpPercap),
rich_country = max(gdpPercap),
poor_country_nom = country[gdpPercap == poor_country],
rich_country_nom = country[gdpPercap == rich_country])
● Extrae los valores correspondientes a las variables
year y pop y calcula la población de todo el
planeta en millones de persona en cada año.
gapminder_sub <- gapminder_df %>%
select(year,pop) %>%
group_by(year) %>%
mutate(pop = sum(pop)) #Se redonde a un único decimal
head(gapminder_sub,n = 5) # Muestra las primeras cinco filas
● Crea un dataframe “df_ancho” en el que cada año se convierta en una columna (variable) y muestra los 6 primeros años
df_ancho <- gapminder_df %>%
select(country, year,pop) %>%
pivot_wider(names_from = year,values_from = pop)
head(df_ancho,6)
● Graba el dataframe como un fichero con formato *.csv
write.csv(df_ancho,
file = 'PaisPob.csv',
sep = ';',
row.names=FALSE)
● Carga de nuevo el dataframe (sobreescribirá el anterior)
df_ancho <- read.table(file = 'PaisPob.csv',
sep = ';',
header=TRUE, # Avisar que los datos tienen una primera # fila que es el nombre de las columnas
check.names = FALSE, #Para que considere carácter cuando los nombres de las columnas son números
stringsAsFactors = FALSE)
head(df_ancho)
● Transforma el dataframe df_ancho en otro dataframe denominado
df_reconstruido en el que se vuelva al formato “long”, con
3 variables: country, year y pop. Ordena todo el conjunto según las
variables country y year.
df_reconstruido <- df_ancho %>%
pivot_longer(
cols = -country, # todas las columnas excepto country
names_to = "year", # el nombre de la nueva variable de años
values_to = "pop" # el nombre de la variable de población
) %>%
mutate(year = as.integer(year)) %>% # convertir year a número
arrange(country, year)
● Imagínate que sólo quiero reconstruir en formato “long” los años 1952, 1972 y 2002.
df_reconstruido <- df_ancho %>%
pivot_longer(
cols = c(`1952`, `1972`, `2002`), # solo las columnas deseadas
names_to = "year",
values_to = "pop"
) %>%
mutate(year = as.integer(year)) %>% # convertir los años a número
arrange(country, year)
● Calcula la media por continente del ingreso per cápita y la esperanza de vida. Ordénalos de mayor a menor según la esperanza de vida.
gapminder_df %>%
group_by(continent) %>%
summarize(gpd=mean(gdpPercap),
lifeE=mean(lifeExp)) %>%
arrange(desc(lifeE))
● Otra de las transformaciones más comunes es agregar nueva información en base a una (o más) columnas en las que coinciden. A continuación se importa un fichero con la evolución de la mortalidad infantil por países.
mortalidadInfantil <- read.csv(file="https://personales.unican.es/rasillad/docencia/g2040/tema_1/datos/mortalidad_infantil.csv",
sep = ",",
header = TRUE,
stringsAsFactors = FALSE)
● Por ejemplo, sabiendo que un dato corresponde a España, podríamos agregar variables específicas para ese país sobre otra dimensión, como podría ser la tasa de mortalidad infantil. Haremos exactamente esto, con la ayuda de otro dataset:
gapminder_argentina <- gapminder_df %>%
filter(country == "Argentina")
gapminder_argentina1952 <- gapminder_argentina %>%
filter(year==1952)
mortalidadInfantilArgentina1952 <- mortalidadInfantil %>%
filter(Year==1952 & country=="Argentina")
gapminder_argentina1952 <- left_join(gapminder_argentina1952,
mortalidadInfantilArgentina1952,
by="country")
gapminder_argentina1952
● …sino que lo podemos hacer para todas las observaciones de la siguiente manera:
gapminder_full <- left_join(gapminder_df,
mortalidadInfantil,
by=c("country","year"="Year"))
gapminder_full
● ¿Cómo ha evolucionado la esperanza de vida media y la población total en cada continente a lo largo del tiempo? Ordénalos por continente y por año
borrame <- gapminder_df %>%
group_by(continent, year) %>% # Agrupamos los datos por continente y año
summarise(espvida_media = mean(lifeExp), popTotal = sum(pop)) %>% # Calculamos la esperanza de vida media y el total de población
arrange(continent, year) # Ordenamos los resultados por continente y año
head(borrame, 12) # Seleccionamos únicamente los primeros 12 (África) por motivos estéticos
● Compara la esperanza de vida y el PIB per cápita entre dos países (a elegir) en 2007 y ordena los resultados según países
borrame <- gapminder_df %>%
filter(year == 2007, country %in% c("Peru", "Chile")) %>% # Filtramos los datos para Perú y Chile en el año 2007
select(country, lifeExp, gdpPercap) %>% # Seleccionamos las columnas de interés
arrange(country) # Ordenamos los resultados por país
● Con todos los países de Asia en 2007 crea una nueva columna calculando la ratio entre PIB per cápita y esperanza de vida, y ordena el resultado de manera descendente
borrame <- gapminder_df %>%
filter(year == 2007, continent == "Asia") %>% # Filtramos los datos para los países en Asia en 2007
mutate(PIB_vs_vida = gdpPercap / lifeExp) %>% # Nueva columna para la relación PIB per cápita / esperanza de vida
select(country, PIB_vs_vida) %>% # Seleccionamos las columnas de interés
arrange(desc(PIB_vs_vida)) # Orden descendente de los resultados orden desce
head(borrame, 10)
● Calcula la esperanza de vida media y el total de población de cada continente en el 2002, y ordena los resultados de mayor a menor esperanza de vida.
gapminder_df %>%
filter(year == 2007) %>% # Filtramos los datos para el año 2007
group_by(continent) %>% # Agrupamos los datos por continente
summarise(espvida_media = mean(lifeExp), popTotal = sum(pop)) %>% # Calculamos la esperanza de vida media y el total de población
arrange(desc(espvida_media)) # Ordenamos esperanza de vida en orden descendente
● Crea una nueva columna con el PIB total (PIB per cápita * población), filtra los países con un PIB total mayor a 1 billón en 2007 y ordénalos de mayor a menor.
gapminder_df %>%
mutate(PIB_Total = gdpPercap * pop) %>% # Nueva columna para el PIB total
filter(year == 2007, PIB_Total > 1e12) %>% # Filtrado del año 2007 y PIB total mayor a 1 billón
select(country, continent, PIB_Total) %>% # Seleccionamos las columnas de interés
arrange(desc(PIB_Total)) # Ordenamos los resultados por PIB total en orden descendente
Ejercicios para nota!!
A partir del data frame gapminder
● ¿Cuál es la observación con mayor expectativa al nacer de todo el dataset? ¿A qué país corresponde y en qué año?
gapminder_df %>%
arrange(desc(lifeExp)) %>%
slice(1)
● ¿Cuál es la expectativa de vida a nacer promedio por continente en 1952? ¿Y en 2007?
gapminder_df %>%
filter(year %in% c(1952, 2007)) %>%
group_by(continent, year) %>%
summarise(lifeExp_mean = mean(lifeExp), .groups = "drop")
● ¿Cuánto aumento la expectativa de vida al nacer por continente entre 2007 y 1952?
gapminder_df %>%
filter(year %in% c(1952, 2007)) %>%
group_by(continent, year) %>%
summarise(lifeExp_mean = mean(lifeExp), .groups = "drop") %>%
tidyr::pivot_wider(names_from = year, values_from = lifeExp_mean) %>%
mutate(increase = `2007` - `1952`)
● ¿Cuál fue el país, por continente, que más aumentó su expectativa de vida al nacer en términos absolutos?
gapminder_df %>%
filter(year %in% c(1952, 2007)) %>%
select(country, continent, year, lifeExp) %>%
tidyr::pivot_wider(names_from = year, values_from = lifeExp) %>%
mutate(increase = `2007` - `1952`) %>%
group_by(continent) %>%
slice_max(order_by = increase, n = 1)
● Entre 1952 y 2007 ¿Cuál fue el país que más aumento su PIB per cápita? ¿Y por continente?
# Global
gapminder_df %>%
filter(year %in% c(1952, 2007)) %>%
select(country, continent, year, gdpPercap) %>%
tidyr::pivot_wider(names_from = year, values_from = gdpPercap) %>%
mutate(increase = `2007` - `1952`) %>%
arrange(desc(increase)) %>%
slice(1)
# Por continente
gapminder_df %>%
filter(year %in% c(1952, 2007)) %>%
select(country, continent, year, gdpPercap) %>%
tidyr::pivot_wider(names_from = year, values_from = gdpPercap) %>%
mutate(increase = `2007` - `1952`) %>%
group_by(continent) %>%
slice_max(order_by = increase, n = 1)
● ¿Cuánto aumento el PIB per cápita de España entre 1952 y2007? ¿Y entre 1977 y 2002?
# Entre 1952 y 2007
gapminder_df %>%
filter(country == "Spain", year %in% c(1952, 2007)) %>%
select(year, gdpPercap) %>%
tidyr::pivot_wider(names_from = year, values_from = gdpPercap) %>%
mutate(increase = `2007` - `1952`)
# Entre 1977 y 2002
gapminder_df %>%
filter(country == "Spain", year %in% c(1977, 2002)) %>%
select(year, gdpPercap) %>%
tidyr::pivot_wider(names_from = year, values_from = gdpPercap) %>%
mutate(increase = `2002` - `1977`)