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:

✅ EJERCICIOS

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