Curso de Importación y Manipulación de datos con R

Importar datos con R

Flujo de Trabajo para Analítica de Datos en R: Inspirado por las Técnicas de Wickham y Grolemund

Flujo de Trabajo para Analítica de Datos en R: Inspirado por las Técnicas de Wickham y Grolemund

La imagen presentada ilustra un modelo de herramientas necesarias para trabajar con datos, propuesto por Hadley Wickham & Garret Grolemund.

En esta primera sección del curso cubriremos la importación de datos, una acción fundamental para poder hacer análisis de datos.

En R se pueden cargar datos de diferentes tipos de archivos como por ejemplo:

.csv Datos separados por comas
.dta Datos de Stata
.sav Datos provenientes de SPSS
.xlsx Datos excel

¡Y muchos más, continua leyendo!

¿Por qué en importante conocer la ruta de trabajo?

Trabajar en un espacio de trabajo predefinido facilita la importación de datos, dado que no es necesario especificar la ruta completa del archivo en cada importación. Por tal motivo, se recomienda almacenar toda la información en una misma ruta.

Otra recomendación útil es organizar tus tareas, trabajos e investigaciones en proyectos separados. De esta manera, cada vez que abras una sesión en un proyecto específico, la ruta de trabajo ya estará predefinida según la ubicación donde se almacene dicho proyecto. Esto facilita el manejo de archivos y mejora la eficiencia en el acceso a los recursos necesarios.

Conoce tu diractorio de trabajo:

getwd() #Obtendras una salida parecida a esta:
## [1] "C:/Users/USUARIO/Documents/Publicaciones/CURSO_R"

¿Puedo cambiar mi directorio de trabajo?

Si deseas usar otra ruta distinta para importar tus archivos lo puedes hacer con el siguiente comando:

#Dentro de los parentesís deberas colocar tu ruta 
setwd("C:/Users/USUARIO/Documents/Publicaciones/CURSO_R")

NOTAS:

  1. Recuerda que tienes que usar \\ o /, además toda la ruta debe estar dentro de las comillas.

  2. Al iniciar una nueva sesión, la ruta de trabajo se restablecerá

Si deseas prácticar con los datos usados aquí, puedes descargarlos aquí

Importación de datos tabulares

No es necesario instalar paquetes adicionales para importar datos de extensión .csv Se puede hacer desde el paquete base que contiene R.

Prueba lo siguiente:

read.csv("Nombre_del_archivo.csv", col_names = FALSE, 
         skip = n)

col_names=TRUE: Indica que la primera fila corresponde a los nombres de las columnas, skip=nOmite las primeras ‘n’ filas del archivo antes de comenzar a leer los datos.

Recuerda que al estar el archivo dentro de tu ruta de trabajo no necesitas usar toda la ruta del archivo. En caso de que desees importar el archivo desde otra carpeta sin necesidad de cambiar la ruta de trabajo, podrías probar con algo como esto:

NOTA:

Puedes utiliza la función choose.files() para encontrar la ruta de tu archivo con mayor facilidad.

Si estas trabajando con grandes conjuntos de datos, puedes optar por utilizar el paquete data.table, el cual permite optimizar el tiempo y memoria al leer los datos.

#install.packages("data.table")
library(data.table)
dt <- fread("Nombre_del_archivo.csv")

Importar datos de ficheros Stata

Para importar datos de extensión .dta o .sav se necesita el siguiente paquete:

#install.packages("haven")
library(haven)
read_dta("Nombre_del_archivo.dta")

Importar datos de ficheros SPSS

library(haven)
read_spss("Nombre_del_archivo.sav") 

Importar datos de excel

Para importar datos de excel puedes usar los paquetes readxl o openxlsx

#install.packages("readxl") #Permite importar archivos
#install.packages("openxlsx") #Permite importar y exportar
library(readxl)
library(openxlsx) 

Probemos con el paquete readxl:

read_excel("Nombre_del_archivo.xlsx", sheet = 1)

Con el argumento sheet puedes especificar el número de hoja a importar o bien el nombre de la misma, ejm: “Precios”

¿Se puede importar más de un archivo a la vez?

En nuestros proyectos nos podemos encontrar que deseamos importar más de un archivo, sería engorroso importar uno por uno, sin embargo, no te debes preocupar, las funciones de R se crearon para ayudar!!

CONSEJO: Puedes optar por crear en tu ruta una carpeta que contenga especificamente los archivos con la misma extensión que deseas de importar:

Para el ejemplo la nueva carpeta se denomina “bases”.

files <-list.files(path="bases",full.names = TRUE)
files
## [1] "bases/electricidad.xls" "bases/pib_percap.xls"

list.files(): Esta es una función en R que se utiliza para listar los nombres de los archivos en un directorio especificado.

path = "bases": Este argumento indica el directorio del cual se quieren listar los archivos. En este caso, está buscando en el directorio llamado “bases”. Si este directorio está dentro del directorio de trabajo actual, buscará allí; de lo contrario, necesitarás proporcionar una ruta completa o relativa.

full.names = TRUE: Este argumento especifica que los nombres de los archivos devueltos deben incluir sus rutas completas. Si estuviera en FALSE (que es el valor predeterminado), list.files() devolvería solo los nombres de los archivos sin la ruta.

Hasta ahora solo hemos guardado los nombres de los archivos, para importarlos puedes hacerlo con el siguiente comando:

bases<-lapply(files,read_xls, sheet=1) 

El código está aplicando la función read_xls a cada uno de los archivos especificados en files, leyendo la primera hoja de cada archivo Excel y almacenando los resultados en la variable bases.

Extraiga los archivos almacenados en la lista:

electricidad <- bases[[1]]
pib <- bases[[2]] 

Estas líneas de código están separando los DataFrames individuales almacenados en la lista bases en variables separadas para su uso y análisis más fácil.

Datos provenientes de Internet

R brinda la facilidad de poder descargar archivos de internet con comandos, ¡Que locura!

Imagina que los datos que necesitas se encuentran en el siguiente url:

url <- "https://raw.githubusercontent.com/zkamvar/r-novice-gapminder/main/episodes/data/gapminder_wide.csv"

#Cargar los datos
dato <- read.csv(url)

Web Scraping

El web scraping se utiliza cuando los datos no están disponibles en un formato fácilmente descargable, como un archivo CSV, sino que están incrustados en el HTML de una página web.

Las APIs (Interfaces de Programación de Aplicaciones) son conjuntos de reglas que permiten a las aplicaciones interactuar entre sí. Actúan como intermediarios, facilitando el acceso a funciones o datos de otros servicios de forma estandarizada. Su uso es fundamental para integrar y ampliar las capacidades de las aplicaciones de software.

Datos de extensión html

#### ####
#install.packages("rvest")
library(rvest)
wiki <-read_html("https://es.wikipedia.org/wiki/Provincias_del_Ecuador")
tablas <- html_nodes(wiki, "table")
provincias <- html_table(tablas[[1]], fill = TRUE)
  • read_html() La función se usa para leer el contenido HTML de la página web proporcionada

  • html_nodes() busca en el documento HTML los nodos que coinciden con el criterio especificado, que aquí es “table”.

  • html_table() se utiliza para convertir el primer nodo de tabla (indicado por tablas[[1]]) en un marco de datos (data frame). El argumento fill = TRUE indica que si hay celdas faltantes en la tabla, deben ser llenadas para mantener la estructura del marco de datos.

API Banco Mundial

Cargar e instalar el paquete necesario:

#install.packages("wbstats")
library(wbstats)

Puedes utrilizar el paquete de la siguiente manera:

#Países disponibles
wb_countries()
## # A tibble: 297 × 18
##    iso3c iso2c country capital_city longitude latitude region_iso3c region_iso2c
##    <chr> <chr> <chr>   <chr>            <dbl>    <dbl> <chr>        <chr>       
##  1 ABW   AW    Aruba   Oranjestad      -70.0     12.5  LCN          ZJ          
##  2 AFE   ZH    Africa… <NA>             NA       NA    <NA>         <NA>        
##  3 AFG   AF    Afghan… Kabul            69.2     34.5  SAS          8S          
##  4 AFR   A9    Africa  <NA>             NA       NA    <NA>         <NA>        
##  5 AFW   ZI    Africa… <NA>             NA       NA    <NA>         <NA>        
##  6 AGO   AO    Angola  Luanda           13.2     -8.81 SSF          ZG          
##  7 ALB   AL    Albania Tirane           19.8     41.3  ECS          Z7          
##  8 AND   AD    Andorra Andorra la …      1.52    42.5  ECS          Z7          
##  9 ARB   1A    Arab W… <NA>             NA       NA    <NA>         <NA>        
## 10 ARE   AE    United… Abu Dhabi        54.4     24.5  MEA          ZQ          
## # ℹ 287 more rows
## # ℹ 10 more variables: region <chr>, admin_region_iso3c <chr>,
## #   admin_region_iso2c <chr>, admin_region <chr>, income_level_iso3c <chr>,
## #   income_level_iso2c <chr>, income_level <chr>, lending_type_iso3c <chr>,
## #   lending_type_iso2c <chr>, lending_type <chr>
#Indicadores disponibles
wb_indicators() 
## # A tibble: 23,720 × 8
##    indicator_id       indicator unit  indicator_desc source_org topics source_id
##    <chr>              <chr>     <lgl> <chr>          <chr>      <list>     <dbl>
##  1 1.0.HCount.1.90usd Poverty … NA    The poverty h… LAC Equit… <df>          37
##  2 1.0.HCount.2.5usd  Poverty … NA    The poverty h… LAC Equit… <df>          37
##  3 1.0.HCount.Mid10t… Middle C… NA    The poverty h… LAC Equit… <df>          37
##  4 1.0.HCount.Ofcl    Official… NA    The poverty h… LAC Equit… <df>          37
##  5 1.0.HCount.Poor4u… Poverty … NA    The poverty h… LAC Equit… <df>          37
##  6 1.0.HCount.Vul4to… Vulnerab… NA    The poverty h… LAC Equit… <df>          37
##  7 1.0.PGap.1.90usd   Poverty … NA    The poverty g… LAC Equit… <df>          37
##  8 1.0.PGap.2.5usd    Poverty … NA    The poverty g… LAC Equit… <df>          37
##  9 1.0.PGap.Poor4uds  Poverty … NA    The poverty g… LAC Equit… <df>          37
## 10 1.0.PSev.1.90usd   Poverty … NA    The poverty s… LAC Equit… <df>          37
## # ℹ 23,710 more rows
## # ℹ 1 more variable: source <chr>
#Para obtener los indicadores en español:
wb_indicators(lang = "es") 
## # A tibble: 23,720 × 8
##    indicator_id       indicator unit  indicator_desc source_org topics source_id
##    <chr>              <chr>     <lgl> <chr>          <chr>      <list>     <dbl>
##  1 1.0.HCount.1.90usd Tasa de … NA    Tasa de Incid… Tabulacio… <df>          37
##  2 1.0.HCount.2.5usd  Tasa de … NA    Tasa de Incid… Tabulacio… <df>          37
##  3 1.0.HCount.Mid10t… Tasa de … NA    Tasa de Incid… Tabulacio… <df>          37
##  4 1.0.HCount.Ofcl    Tasa Ofi… NA    Tasa de Incid… Tabulacio… <df>          37
##  5 1.0.HCount.Poor4u… Tasa de … NA    Tasa de Incid… Tabulacio… <df>          37
##  6 1.0.HCount.Vul4to… Tasa de … NA    Tasa de Incid… Tabulacio… <df>          37
##  7 1.0.PGap.1.90usd   Brecha d… NA    La Brecha de … Tabulacio… <df>          37
##  8 1.0.PGap.2.5usd    Brecha d… NA    La Brecha de … Tabulacio… <df>          37
##  9 1.0.PGap.Poor4uds  Brecha d… NA    La Brecha de … Tabulacio… <df>          37
## 10 1.0.PSev.1.90usd   Severida… NA    El índice de … Tabulacio… <df>          37
## # ℹ 23,710 more rows
## # ℹ 1 more variable: source <chr>
#Datos relacionados con turismo
wb_search(pattern = c("Unemployment"))
## # A tibble: 61 × 3
##    indicator_id indicator                                         indicator_desc
##    <chr>        <chr>                                             <chr>         
##  1 fin37.t.a    Received government transfers in the past year (… The percentag…
##  2 fin37.t.a.1  Received government transfers in the past year, … The percentag…
##  3 fin37.t.a.10 Received government transfers in the past year, … The percentag…
##  4 fin37.t.a.11 Received government transfers in the past year, … The percentag…
##  5 fin37.t.a.2  Received government transfers in the past year, … The percentag…
##  6 fin37.t.a.3  Received government transfers in the past year, … The percentag…
##  7 fin37.t.a.4  Received government transfers in the past year, … The percentag…
##  8 fin37.t.a.5  Received government transfers in the past year, … The percentag…
##  9 fin37.t.a.6  Received government transfers in the past year, … The percentag…
## 10 fin37.t.a.7  Received government transfers in the past year, … The percentag…
## # ℹ 51 more rows
#Descarga los datos que necesites
paises_latinos <- c("ABW","ARG","ATG","BHS","BLZ","BOL", "BRA","BRB","CHL","COL",
"CRI","CUB","CUW","CYM","DMA","DOM","ECU","GRD","GTM","GUY","HND","HTI","JAM","KNA","LCA","MAF","MEX","NIC","PAN","PER","PRI","PRY","SLV","SUR", "SXM","TCA","TTO","URY","VCT","VEN","VGB","VIR")
desempleo <- wb_data(
  indicator = "SL.UEM.TOTL.ZS", 
  country = paises_latinos,
  start_date = 1960, end_date = 2020)

#Puedes importar más de un indicador:
data <- wb_data(
  indicator = c("SL.UEM.TOTL.ZS","FP.CPI.TOTL.ZG"))

#Si deseas de todos los países y todos los años disponibles, no es necesario que se especifiquen los argumentos country, start_date y end_date.

Yahoo Finance API

# Asegúrate de que el paquete quantmod esté instalado
#install.packages("quantmod")
library(quantmod)
# Obtener datos de Microsoft (MSFT)
#Los datos además se guardan en un objeto denominada en este caso MSFT.
getSymbols("MSFT", src = "yahoo")
## [1] "MSFT"
MSFT.Open MSFT.High MSFT.Low MSFT.Close MSFT.Volume MSFT.Adjusted
29.91 30.25 29.40 29.86 76935100 21.43699
29.70 29.97 29.44 29.81 45774500 21.40110
29.63 29.75 29.45 29.64 44607200 21.27905
29.65 30.10 29.53 29.93 50220200 21.48725
30.00 30.18 29.73 29.96 44636600 21.50879
29.80 29.89 29.43 29.66 55017400 21.29341

Manipulación de datos con R

Habiendo importado nuestros datos en R, estamos listos para el siguiente paso en nuestro flujo: la transformación de datos. Aunque el ordenamiento y limpieza (‘tidy’) son cruciales, nos centraremos primero en transformar los datos, integrando gradualmente el proceso ‘tidy’ para demostrar su importancia en el análisis de datos.

Empecemos por conocer otro tipo de marco de datos denominado tibble. Los tibbles son una versión moderna y mejorada de los data frames en R, diseñados específicamente para el ecosistema Tidyverse. Aunque similares en estructura, los tibbles mejoran la experiencia del usuario con una impresión más amigable en la consola, manejo más intuitivo de las variables no estándar y una mayor compatibilidad con los datos almacenados en formatos diversos. Estas características hacen de los tibbles una opción preferida para el análisis de datos en R.

Almacenemos nuestro datos en un objeto tibble:

#install.packages("tibble")
library(tibble)
datos <- as_tibble(dato) #convertir a un tibble
glimpse(datos) #similar a str() pero es útil con los tibble
## Rows: 142
## Columns: 38
## $ continent      <chr> "Africa", "Africa", "Africa", "Africa", "Africa", "Afri…
## $ country        <chr> "Algeria", "Angola", "Benin", "Botswana", "Burkina Faso…
## $ gdpPercap_1952 <dbl> 2449.0082, 3520.6103, 1062.7522, 851.2411, 543.2552, 33…
## $ gdpPercap_1957 <dbl> 3013.9760, 3827.9405, 959.6011, 918.2325, 617.1835, 379…
## $ gdpPercap_1962 <dbl> 2550.8169, 4269.2767, 949.4991, 983.6540, 722.5120, 355…
## $ gdpPercap_1967 <dbl> 3246.9918, 5522.7764, 1035.8314, 1214.7093, 794.8266, 4…
## $ gdpPercap_1972 <dbl> 4182.6638, 5473.2880, 1085.7969, 2263.6111, 854.7360, 4…
## $ gdpPercap_1977 <dbl> 4910.4168, 3008.6474, 1029.1613, 3214.8578, 743.3870, 5…
## $ gdpPercap_1982 <dbl> 5745.1602, 2756.9537, 1277.8976, 4551.1421, 807.1986, 5…
## $ gdpPercap_1987 <dbl> 5681.3585, 2430.2083, 1225.8560, 6205.8839, 912.0631, 6…
## $ gdpPercap_1992 <dbl> 5023.2166, 2627.8457, 1191.2077, 7954.1116, 931.7528, 6…
## $ gdpPercap_1997 <dbl> 4797.2951, 2277.1409, 1232.9753, 8647.1423, 946.2950, 4…
## $ gdpPercap_2002 <dbl> 5288.0404, 2773.2873, 1372.8779, 11003.6051, 1037.6452,…
## $ gdpPercap_2007 <dbl> 6223.3675, 4797.2313, 1441.2849, 12569.8518, 1217.0330,…
## $ lifeExp_1952   <dbl> 43.077, 30.015, 38.223, 47.622, 31.975, 39.031, 38.523,…
## $ lifeExp_1957   <dbl> 45.685, 31.999, 40.358, 49.618, 34.906, 40.533, 40.428,…
## $ lifeExp_1962   <dbl> 48.303, 34.000, 42.618, 51.520, 37.814, 42.045, 42.643,…
## $ lifeExp_1967   <dbl> 51.407, 35.985, 44.885, 53.298, 40.697, 43.548, 44.799,…
## $ lifeExp_1972   <dbl> 54.518, 37.928, 47.014, 56.024, 43.591, 44.057, 47.049,…
## $ lifeExp_1977   <dbl> 58.014, 39.483, 49.190, 59.319, 46.137, 45.910, 49.355,…
## $ lifeExp_1982   <dbl> 61.368, 39.942, 50.904, 61.484, 48.122, 47.471, 52.961,…
## $ lifeExp_1987   <dbl> 65.799, 39.906, 52.337, 63.622, 49.557, 48.211, 54.985,…
## $ lifeExp_1992   <dbl> 67.744, 40.647, 53.919, 62.745, 50.260, 44.736, 54.314,…
## $ lifeExp_1997   <dbl> 69.152, 40.963, 54.777, 52.556, 50.324, 45.326, 52.199,…
## $ lifeExp_2002   <dbl> 70.994, 41.003, 54.406, 46.634, 50.650, 47.360, 49.856,…
## $ lifeExp_2007   <dbl> 72.301, 42.731, 56.728, 50.728, 52.295, 49.580, 50.430,…
## $ pop_1952       <dbl> 9279525, 4232095, 1738315, 442308, 4469979, 2445618, 50…
## $ pop_1957       <dbl> 10270856, 4561361, 1925173, 474639, 4713416, 2667518, 5…
## $ pop_1962       <dbl> 11000948, 4826015, 2151895, 512764, 4919632, 2961915, 5…
## $ pop_1967       <dbl> 12760499, 5247469, 2427334, 553541, 5127935, 3330989, 6…
## $ pop_1972       <dbl> 14760787, 5894858, 2761407, 619351, 5433886, 3529983, 7…
## $ pop_1977       <dbl> 17152804, 6162675, 3168267, 781472, 5889574, 3834415, 7…
## $ pop_1982       <dbl> 20033753, 7016384, 3641603, 970347, 6634596, 4580410, 9…
## $ pop_1987       <dbl> 23254956, 7874230, 4243788, 1151184, 7586551, 5126023, …
## $ pop_1992       <dbl> 26298373, 8735988, 4981671, 1342614, 8878303, 5809236, …
## $ pop_1997       <dbl> 29072015, 9875024, 6066080, 1536536, 10352843, 6121610,…
## $ pop_2002       <int> 31287142, 10866106, 7026113, 1630347, 12251209, 7021078…
## $ pop_2007       <int> 33333216, 12420476, 8078314, 1639131, 14326203, 8390505…

Una vez obtenido los datos en el formato que necesitamos, podemos empezar.

Dentro de R, dplyr es un paquete esencial para la manipulación de datos, este además de tibble forma parte del mundo tidyverse.

#install.packages("dplyr")
library(dplyr)

Los verbos principales que integran sus funciones son:

  1. filter(),

  2. select(),

  3. arrange(),

  4. mutate(),

  5. summarise() y

  6. group_by().

Cada una de estas funciones juega un papel esencial en la transformación y análisis de datos. Además de estas herramientas fundamentales, también exploraremos funciones adicionales dentro de dplyr para enriquecer tu comprensión y habilidades en el manejo de este paquete.

Filtrar observaciones

filter()permite crear un sub-conjunto de las observaciones de nuestro datos.

  • Comparaciones

Conjunto estándar: >, >=, <, <=, !=(no igual) y ==(igual)

#Filtra por el continente que sea Africa
datos %>% filter(continent=="Africa")
## # A tibble: 52 × 38
##    continent country gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##    <chr>     <chr>            <dbl>          <dbl>          <dbl>          <dbl>
##  1 Africa    Algeria          2449.          3014.          2551.          3247.
##  2 Africa    Angola           3521.          3828.          4269.          5523.
##  3 Africa    Benin            1063.           960.           949.          1036.
##  4 Africa    Botswa…           851.           918.           984.          1215.
##  5 Africa    Burkin…           543.           617.           723.           795.
##  6 Africa    Burundi           339.           380.           355.           413.
##  7 Africa    Camero…          1173.          1313.          1400.          1508.
##  8 Africa    Centra…          1071.          1191.          1193.          1136.
##  9 Africa    Chad             1179.          1308.          1390.          1197.
## 10 Africa    Comoros          1103.          1211.          1407.          1876.
## # ℹ 42 more rows
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>, …
#Filtra las observaciones de gdpPercap_1952 que sean mayores o iguales a 5000
datos %>% filter(gdpPercap_1952>=5000)
## # A tibble: 27 × 38
##    continent country gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##    <chr>     <chr>            <dbl>          <dbl>          <dbl>          <dbl>
##  1 Americas  Argent…          5911.          6857.          7133.          8053.
##  2 Americas  Canada          11367.         12490.         13462.         16077.
##  3 Americas  Cuba             5587.          6092.          5181.          5690.
##  4 Americas  United…         13990.         14847.         16173.         19530.
##  5 Americas  Uruguay          5717.          6151.          5603.          5445.
##  6 Americas  Venezu…          7690.          9802.          8423.          9541.
##  7 Asia      Bahrain          9867.         11636.         12753.         14805.
##  8 Asia      Kuwait         108382.        113523.         95458.         80895.
##  9 Asia      Saudi …          6460.          8158.         11626.         16903.
## 10 Europe    Austria          6137.          8843.         10751.         12835.
## # ℹ 17 more rows
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>, …
#Filtra las observaciones de gdpPercap_1952 que tengan valores NA
datos %>% filter(is.na(gdpPercap_1952))
## # A tibble: 0 × 38
## # ℹ 38 variables: continent <chr>, country <chr>, gdpPercap_1952 <dbl>,
## #   gdpPercap_1957 <dbl>, gdpPercap_1962 <dbl>, gdpPercap_1967 <dbl>,
## #   gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>, gdpPercap_1982 <dbl>,
## #   gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>, gdpPercap_1997 <dbl>,
## #   gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>, lifeExp_1952 <dbl>,
## #   lifeExp_1957 <dbl>, lifeExp_1962 <dbl>, lifeExp_1967 <dbl>,
## #   lifeExp_1972 <dbl>, lifeExp_1977 <dbl>, lifeExp_1982 <dbl>, …
#Filtrar por exepción
#Filtra observaciones en las que el país NO sea Algeria.
datos %>% filter(!country=="Algeria")
## # A tibble: 141 × 38
##    continent country gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##    <chr>     <chr>            <dbl>          <dbl>          <dbl>          <dbl>
##  1 Africa    Angola           3521.          3828.          4269.          5523.
##  2 Africa    Benin            1063.           960.           949.          1036.
##  3 Africa    Botswa…           851.           918.           984.          1215.
##  4 Africa    Burkin…           543.           617.           723.           795.
##  5 Africa    Burundi           339.           380.           355.           413.
##  6 Africa    Camero…          1173.          1313.          1400.          1508.
##  7 Africa    Centra…          1071.          1191.          1193.          1136.
##  8 Africa    Chad             1179.          1308.          1390.          1197.
##  9 Africa    Comoros          1103.          1211.          1407.          1876.
## 10 Africa    Congo …           781.           906.           896.           862.
## # ℹ 131 more rows
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>, …

El operador %>%, conocido como el operador de tubería (pipe operator), Permite encadenar múltiples funciones de manera clara y legible, pasando el resultado de una función como primer argumento a la siguiente. Forma parte del paquete magrittr pero si ya has cargado dplyr previamente, tendrás el operador %>% disponible automáticamente.

  • Operadores lógicos

El operador | es un operador lógico “OR” que permite incluir filas que cumplan cualquiera de las dos condiciones.

datos %>% filter(country=="Ecuador" | country=="Chile")
## # A tibble: 2 × 38
##   continent country gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##   <chr>     <chr>            <dbl>          <dbl>          <dbl>          <dbl>
## 1 Americas  Chile            3940.          4316.          4519.          5107.
## 2 Americas  Ecuador          3522.          3781.          4086.          4579.
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>,
## #   lifeExp_1997 <dbl>, lifeExp_2002 <dbl>, lifeExp_2007 <dbl>, …
#Otra opción es:
#Operador %in%
datos %>% filter(country %in% c("Ecuador", "Chile", "Mexico"))
## # A tibble: 3 × 38
##   continent country gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##   <chr>     <chr>            <dbl>          <dbl>          <dbl>          <dbl>
## 1 Americas  Chile            3940.          4316.          4519.          5107.
## 2 Americas  Ecuador          3522.          3781.          4086.          4579.
## 3 Americas  Mexico           3478.          4132.          4582.          5755.
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>,
## #   lifeExp_1997 <dbl>, lifeExp_2002 <dbl>, lifeExp_2007 <dbl>, …

El operador &, que es un operador lógico “AND”, lo que significa que ambas condiciones deben ser verdaderas para que una fila sea incluida en el resultado.

datos %>% filter(continent=="Europe"& gdpPercap_1952<5000)
## # A tibble: 14 × 38
##    continent country gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##    <chr>     <chr>            <dbl>          <dbl>          <dbl>          <dbl>
##  1 Europe    Albania          1601.          1942.          2313.          2760.
##  2 Europe    Bosnia…           974.          1354.          1710.          2172.
##  3 Europe    Bulgar…          2444.          3009.          4254.          5577.
##  4 Europe    Croatia          3119.          4338.          5478.          6960.
##  5 Europe    Greece           3531.          4916.          6017.          8513.
##  6 Europe    Italy            4931.          6249.          8244.         10022.
##  7 Europe    Monten…          2648.          3682.          4650.          5908.
##  8 Europe    Poland           4029.          4734.          5339.          6557.
##  9 Europe    Portug…          3068.          3775.          4728.          6362.
## 10 Europe    Romania          3145.          3943.          4735.          6471.
## 11 Europe    Serbia           3581.          4981.          6290.          7992.
## 12 Europe    Sloven…          4215.          5862.          7402.          9405.
## 13 Europe    Spain            3834.          4565.          5694.          7994.
## 14 Europe    Turkey           1969.          2219.          2323.          2826.
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>,
## #   lifeExp_1997 <dbl>, lifeExp_2002 <dbl>, lifeExp_2007 <dbl>, …
#Puedes utilizar:
datos %>% filter(continent=="Europe", gdpPercap_1952<5000)
## # A tibble: 14 × 38
##    continent country gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##    <chr>     <chr>            <dbl>          <dbl>          <dbl>          <dbl>
##  1 Europe    Albania          1601.          1942.          2313.          2760.
##  2 Europe    Bosnia…           974.          1354.          1710.          2172.
##  3 Europe    Bulgar…          2444.          3009.          4254.          5577.
##  4 Europe    Croatia          3119.          4338.          5478.          6960.
##  5 Europe    Greece           3531.          4916.          6017.          8513.
##  6 Europe    Italy            4931.          6249.          8244.         10022.
##  7 Europe    Monten…          2648.          3682.          4650.          5908.
##  8 Europe    Poland           4029.          4734.          5339.          6557.
##  9 Europe    Portug…          3068.          3775.          4728.          6362.
## 10 Europe    Romania          3145.          3943.          4735.          6471.
## 11 Europe    Serbia           3581.          4981.          6290.          7992.
## 12 Europe    Sloven…          4215.          5862.          7402.          9405.
## 13 Europe    Spain            3834.          4565.          5694.          7994.
## 14 Europe    Turkey           1969.          2219.          2323.          2826.
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>,
## #   lifeExp_1997 <dbl>, lifeExp_2002 <dbl>, lifeExp_2007 <dbl>, …

Dentro de la manipulación de casos tambien es útil distinct() para obtener solo los registros únicos de la columna

datos %>% distinct(continent) 
## # A tibble: 5 × 1
##   continent
##   <chr>    
## 1 Africa   
## 2 Americas 
## 3 Asia     
## 4 Europe   
## 5 Oceania

Cuando se trabaja con datos que poseen cadenas de texto, se puede combinar filter con otras funciones de otros paquetes, como por ejemplo: stringer uno más del ecosistema tidyverse.

La función str_detect se utiliza para identificar si un patrón específico de texto está presente en una cadena de caracteres.

#install.packages("stringr")
library(stringr)
# Filas donde la columna country contiene la letra "o" en cualquier parte de su texto
datos %>% filter(str_detect(country,"o"))
## # A tibble: 50 × 38
##    continent country gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##    <chr>     <chr>            <dbl>          <dbl>          <dbl>          <dbl>
##  1 Africa    Angola           3521.          3828.          4269.          5523.
##  2 Africa    Botswa…           851.           918.           984.          1215.
##  3 Africa    Burkin…           543.           617.           723.           795.
##  4 Africa    Camero…          1173.          1313.          1400.          1508.
##  5 Africa    Comoros          1103.          1211.          1407.          1876.
##  6 Africa    Congo …           781.           906.           896.           862.
##  7 Africa    Congo …          2126.          2315.          2465.          2678.
##  8 Africa    Cote d…          1389.          1501.          1729.          2052.
##  9 Africa    Djibou…          2670.          2865.          3021.          3020.
## 10 Africa    Equato…           376.           426.           583.           916.
## # ℹ 40 more rows
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>, …
# Filas donde country comienza con la letra "A"
datos %>% filter(str_detect(country,"^A"))
## # A tibble: 7 × 38
##   continent country  gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##   <chr>     <chr>             <dbl>          <dbl>          <dbl>          <dbl>
## 1 Africa    Algeria           2449.          3014.          2551.          3247.
## 2 Africa    Angola            3521.          3828.          4269.          5523.
## 3 Americas  Argenti…          5911.          6857.          7133.          8053.
## 4 Asia      Afghani…           779.           821.           853.           836.
## 5 Europe    Albania           1601.          1942.          2313.          2760.
## 6 Europe    Austria           6137.          8843.         10751.         12835.
## 7 Oceania   Austral…         10040.         10950.         12217.         14526.
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>,
## #   lifeExp_1997 <dbl>, lifeExp_2002 <dbl>, lifeExp_2007 <dbl>, …
# Filas en donde las cadenas terminen con la letra "s"
datos %>% filter(str_detect(country,"s$"))
## # A tibble: 6 × 38
##   continent country  gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##   <chr>     <chr>             <dbl>          <dbl>          <dbl>          <dbl>
## 1 Africa    Comoros           1103.          1211.          1407.          1876.
## 2 Africa    Mauriti…          1968.          2034.          2529.          2475.
## 3 Americas  Honduras          2195.          2220.          2291.          2538.
## 4 Americas  United …         13990.         14847.         16173.         19530.
## 5 Asia      Philipp…          1273.          1548.          1650.          1814.
## 6 Europe    Netherl…          8942.         11276.         12791.         15363.
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>,
## #   lifeExp_1997 <dbl>, lifeExp_2002 <dbl>, lifeExp_2007 <dbl>, …

Seleccionar variables

select() Permite obtener un subconjunto de datos solo con las variables (columnas) de interés.

Seleccionar Columnas Específicas:

datos %>% select(country, gdpPercap_1952, lifeExp_1952, pop_1952)
## # A tibble: 142 × 4
##    country                  gdpPercap_1952 lifeExp_1952 pop_1952
##    <chr>                             <dbl>        <dbl>    <dbl>
##  1 Algeria                           2449.         43.1  9279525
##  2 Angola                            3521.         30.0  4232095
##  3 Benin                             1063.         38.2  1738315
##  4 Botswana                           851.         47.6   442308
##  5 Burkina Faso                       543.         32.0  4469979
##  6 Burundi                            339.         39.0  2445618
##  7 Cameroon                          1173.         38.5  5009067
##  8 Central African Republic          1071.         35.5  1291695
##  9 Chad                              1179.         38.1  2682462
## 10 Comoros                           1103.         40.7   153936
## # ℹ 132 more rows

Excluir columnas:

#Una
datos %>% select(-continent)
## # A tibble: 142 × 37
##    country           gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##    <chr>                      <dbl>          <dbl>          <dbl>          <dbl>
##  1 Algeria                    2449.          3014.          2551.          3247.
##  2 Angola                     3521.          3828.          4269.          5523.
##  3 Benin                      1063.           960.           949.          1036.
##  4 Botswana                    851.           918.           984.          1215.
##  5 Burkina Faso                543.           617.           723.           795.
##  6 Burundi                     339.           380.           355.           413.
##  7 Cameroon                   1173.          1313.          1400.          1508.
##  8 Central African …          1071.          1191.          1193.          1136.
##  9 Chad                       1179.          1308.          1390.          1197.
## 10 Comoros                    1103.          1211.          1407.          1876.
## # ℹ 132 more rows
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>, …
#Múltiples
datos %>% select(-continent, -gdpPercap_1957)
## # A tibble: 142 × 36
##    country           gdpPercap_1952 gdpPercap_1962 gdpPercap_1967 gdpPercap_1972
##    <chr>                      <dbl>          <dbl>          <dbl>          <dbl>
##  1 Algeria                    2449.          2551.          3247.          4183.
##  2 Angola                     3521.          4269.          5523.          5473.
##  3 Benin                      1063.           949.          1036.          1086.
##  4 Botswana                    851.           984.          1215.          2264.
##  5 Burkina Faso                543.           723.           795.           855.
##  6 Burundi                     339.           355.           413.           464.
##  7 Cameroon                   1173.          1400.          1508.          1684.
##  8 Central African …          1071.          1193.          1136.          1070.
##  9 Chad                       1179.          1390.          1197.          1104.
## 10 Comoros                    1103.          1407.          1876.          1938.
## # ℹ 132 more rows
## # ℹ 31 more variables: gdpPercap_1977 <dbl>, gdpPercap_1982 <dbl>,
## #   gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>, gdpPercap_1997 <dbl>,
## #   gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>, lifeExp_1952 <dbl>,
## #   lifeExp_1957 <dbl>, lifeExp_1962 <dbl>, lifeExp_1967 <dbl>,
## #   lifeExp_1972 <dbl>, lifeExp_1977 <dbl>, lifeExp_1982 <dbl>,
## #   lifeExp_1987 <dbl>, lifeExp_1992 <dbl>, lifeExp_1997 <dbl>, …
#Forma adicional
datos %>% select(-c(continent, gdpPercap_1957))
## # A tibble: 142 × 36
##    country           gdpPercap_1952 gdpPercap_1962 gdpPercap_1967 gdpPercap_1972
##    <chr>                      <dbl>          <dbl>          <dbl>          <dbl>
##  1 Algeria                    2449.          2551.          3247.          4183.
##  2 Angola                     3521.          4269.          5523.          5473.
##  3 Benin                      1063.           949.          1036.          1086.
##  4 Botswana                    851.           984.          1215.          2264.
##  5 Burkina Faso                543.           723.           795.           855.
##  6 Burundi                     339.           355.           413.           464.
##  7 Cameroon                   1173.          1400.          1508.          1684.
##  8 Central African …          1071.          1193.          1136.          1070.
##  9 Chad                       1179.          1390.          1197.          1104.
## 10 Comoros                    1103.          1407.          1876.          1938.
## # ℹ 132 more rows
## # ℹ 31 more variables: gdpPercap_1977 <dbl>, gdpPercap_1982 <dbl>,
## #   gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>, gdpPercap_1997 <dbl>,
## #   gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>, lifeExp_1952 <dbl>,
## #   lifeExp_1957 <dbl>, lifeExp_1962 <dbl>, lifeExp_1967 <dbl>,
## #   lifeExp_1972 <dbl>, lifeExp_1977 <dbl>, lifeExp_1982 <dbl>,
## #   lifeExp_1987 <dbl>, lifeExp_1992 <dbl>, lifeExp_1997 <dbl>, …
#Rango de columnas
datos %>% select(country,gdpPercap_1957:gdpPercap_2007) 
## # A tibble: 142 × 12
##    country           gdpPercap_1957 gdpPercap_1962 gdpPercap_1967 gdpPercap_1972
##    <chr>                      <dbl>          <dbl>          <dbl>          <dbl>
##  1 Algeria                    3014.          2551.          3247.          4183.
##  2 Angola                     3828.          4269.          5523.          5473.
##  3 Benin                       960.           949.          1036.          1086.
##  4 Botswana                    918.           984.          1215.          2264.
##  5 Burkina Faso                617.           723.           795.           855.
##  6 Burundi                     380.           355.           413.           464.
##  7 Cameroon                   1313.          1400.          1508.          1684.
##  8 Central African …          1191.          1193.          1136.          1070.
##  9 Chad                       1308.          1390.          1197.          1104.
## 10 Comoros                    1211.          1407.          1876.          1938.
## # ℹ 132 more rows
## # ℹ 7 more variables: gdpPercap_1977 <dbl>, gdpPercap_1982 <dbl>,
## #   gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>, gdpPercap_1997 <dbl>,
## #   gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>

Dentro de select() puedes utilizar otras funciones de ayuda:

#Columnas que inicien con "lifeExp"
datos %>% select(country,starts_with("lifeExp"))
## # A tibble: 142 × 13
##    country      lifeExp_1952 lifeExp_1957 lifeExp_1962 lifeExp_1967 lifeExp_1972
##    <chr>               <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
##  1 Algeria              43.1         45.7         48.3         51.4         54.5
##  2 Angola               30.0         32.0         34           36.0         37.9
##  3 Benin                38.2         40.4         42.6         44.9         47.0
##  4 Botswana             47.6         49.6         51.5         53.3         56.0
##  5 Burkina Faso         32.0         34.9         37.8         40.7         43.6
##  6 Burundi              39.0         40.5         42.0         43.5         44.1
##  7 Cameroon             38.5         40.4         42.6         44.8         47.0
##  8 Central Afr…         35.5         37.5         39.5         41.5         43.5
##  9 Chad                 38.1         39.9         41.7         43.6         45.6
## 10 Comoros              40.7         42.5         44.5         46.5         48.9
## # ℹ 132 more rows
## # ℹ 7 more variables: lifeExp_1977 <dbl>, lifeExp_1982 <dbl>,
## #   lifeExp_1987 <dbl>, lifeExp_1992 <dbl>, lifeExp_1997 <dbl>,
## #   lifeExp_2002 <dbl>, lifeExp_2007 <dbl>
#Seleccionar columnas que contengan "Gdp":
datos %>% select(country, contains("Gdp"))
## # A tibble: 142 × 13
##    country           gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##    <chr>                      <dbl>          <dbl>          <dbl>          <dbl>
##  1 Algeria                    2449.          3014.          2551.          3247.
##  2 Angola                     3521.          3828.          4269.          5523.
##  3 Benin                      1063.           960.           949.          1036.
##  4 Botswana                    851.           918.           984.          1215.
##  5 Burkina Faso                543.           617.           723.           795.
##  6 Burundi                     339.           380.           355.           413.
##  7 Cameroon                   1173.          1313.          1400.          1508.
##  8 Central African …          1071.          1191.          1193.          1136.
##  9 Chad                       1179.          1308.          1390.          1197.
## 10 Comoros                    1103.          1211.          1407.          1876.
## # ℹ 132 more rows
## # ℹ 8 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>
#Seleccionar columnas que finalicen con "1997":
datos %>% select(country, ends_with("1997"))
## # A tibble: 142 × 4
##    country                  gdpPercap_1997 lifeExp_1997 pop_1997
##    <chr>                             <dbl>        <dbl>    <dbl>
##  1 Algeria                           4797.         69.2 29072015
##  2 Angola                            2277.         41.0  9875024
##  3 Benin                             1233.         54.8  6066080
##  4 Botswana                          8647.         52.6  1536536
##  5 Burkina Faso                       946.         50.3 10352843
##  6 Burundi                            463.         45.3  6121610
##  7 Cameroon                          1694.         52.2 14195809
##  8 Central African Republic           741.         46.1  3696513
##  9 Chad                              1005.         51.6  7562011
## 10 Comoros                           1174.         60.7   527982
## # ℹ 132 more rows

El orden de las variables tambien se establece con select(), así que si deseas colocar una columna al inicio de todas las demás, se puede usar:

#Mueve la columna country al principio del conjunto de datos, manteniendo todas las demás columnas en su orden original.
datos %>% select(country,everything())
## # A tibble: 142 × 38
##    country continent gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##    <chr>   <chr>              <dbl>          <dbl>          <dbl>          <dbl>
##  1 Algeria Africa             2449.          3014.          2551.          3247.
##  2 Angola  Africa             3521.          3828.          4269.          5523.
##  3 Benin   Africa             1063.           960.           949.          1036.
##  4 Botswa… Africa              851.           918.           984.          1215.
##  5 Burkin… Africa              543.           617.           723.           795.
##  6 Burundi Africa              339.           380.           355.           413.
##  7 Camero… Africa             1173.          1313.          1400.          1508.
##  8 Centra… Africa             1071.          1191.          1193.          1136.
##  9 Chad    Africa             1179.          1308.          1390.          1197.
## 10 Comoros Africa             1103.          1211.          1407.          1876.
## # ℹ 132 more rows
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>, …

Reorganizar variables

Para cambiar la posición de las columnas tambien se puede utilizar relocate():

#La función relocate() por defecto coloca la columna especificada al inicio del conjunto de datos:
datos %>% relocate(country)
## # A tibble: 142 × 38
##    country continent gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##    <chr>   <chr>              <dbl>          <dbl>          <dbl>          <dbl>
##  1 Algeria Africa             2449.          3014.          2551.          3247.
##  2 Angola  Africa             3521.          3828.          4269.          5523.
##  3 Benin   Africa             1063.           960.           949.          1036.
##  4 Botswa… Africa              851.           918.           984.          1215.
##  5 Burkin… Africa              543.           617.           723.           795.
##  6 Burundi Africa              339.           380.           355.           413.
##  7 Camero… Africa             1173.          1313.          1400.          1508.
##  8 Centra… Africa             1071.          1191.          1193.          1136.
##  9 Chad    Africa             1179.          1308.          1390.          1197.
## 10 Comoros Africa             1103.          1211.          1407.          1876.
## # ℹ 132 more rows
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>, …
#Mover una Columna a una Posición Específica
#Caso 1
#El argumento .before=gdpPercap_1952 indica que lifeExp_1997 debe ser colocada antes de gdpPercap_1952
datos %>% relocate(c(lifeExp_1997, pop_1997),.before=gdpPercap_1952)
## # A tibble: 142 × 38
##    continent country         lifeExp_1997 pop_1997 gdpPercap_1952 gdpPercap_1957
##    <chr>     <chr>                  <dbl>    <dbl>          <dbl>          <dbl>
##  1 Africa    Algeria                 69.2 29072015          2449.          3014.
##  2 Africa    Angola                  41.0  9875024          3521.          3828.
##  3 Africa    Benin                   54.8  6066080          1063.           960.
##  4 Africa    Botswana                52.6  1536536           851.           918.
##  5 Africa    Burkina Faso            50.3 10352843           543.           617.
##  6 Africa    Burundi                 45.3  6121610           339.           380.
##  7 Africa    Cameroon                52.2 14195809          1173.          1313.
##  8 Africa    Central Africa…         46.1  3696513          1071.          1191.
##  9 Africa    Chad                    51.6  7562011          1179.          1308.
## 10 Africa    Comoros                 60.7   527982          1103.          1211.
## # ℹ 132 more rows
## # ℹ 32 more variables: gdpPercap_1962 <dbl>, gdpPercap_1967 <dbl>,
## #   gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>, gdpPercap_1982 <dbl>,
## #   gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>, gdpPercap_1997 <dbl>,
## #   gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>, lifeExp_1952 <dbl>,
## #   lifeExp_1957 <dbl>, lifeExp_1962 <dbl>, lifeExp_1967 <dbl>,
## #   lifeExp_1972 <dbl>, lifeExp_1977 <dbl>, lifeExp_1982 <dbl>, …
#Caso 2
#El argumento .after=gdpPercap_1952 indica que lifeExp_1997 debe ser colocada antes de gdpPercap_1952
datos %>% relocate(c(lifeExp_1997, pop_1997),.after=gdpPercap_1952)
## # A tibble: 142 × 38
##    continent country         gdpPercap_1952 lifeExp_1997 pop_1997 gdpPercap_1957
##    <chr>     <chr>                    <dbl>        <dbl>    <dbl>          <dbl>
##  1 Africa    Algeria                  2449.         69.2 29072015          3014.
##  2 Africa    Angola                   3521.         41.0  9875024          3828.
##  3 Africa    Benin                    1063.         54.8  6066080           960.
##  4 Africa    Botswana                  851.         52.6  1536536           918.
##  5 Africa    Burkina Faso              543.         50.3 10352843           617.
##  6 Africa    Burundi                   339.         45.3  6121610           380.
##  7 Africa    Cameroon                 1173.         52.2 14195809          1313.
##  8 Africa    Central Africa…          1071.         46.1  3696513          1191.
##  9 Africa    Chad                     1179.         51.6  7562011          1308.
## 10 Africa    Comoros                  1103.         60.7   527982          1211.
## # ℹ 132 more rows
## # ℹ 32 more variables: gdpPercap_1962 <dbl>, gdpPercap_1967 <dbl>,
## #   gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>, gdpPercap_1982 <dbl>,
## #   gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>, gdpPercap_1997 <dbl>,
## #   gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>, lifeExp_1952 <dbl>,
## #   lifeExp_1957 <dbl>, lifeExp_1962 <dbl>, lifeExp_1967 <dbl>,
## #   lifeExp_1972 <dbl>, lifeExp_1977 <dbl>, lifeExp_1982 <dbl>, …

Organizar filas

arrange() se utiliza para ordenar las filas de un conjunto de datos

#Orden ascendente
datos %>% arrange(country)
## # A tibble: 142 × 38
##    continent country gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##    <chr>     <chr>            <dbl>          <dbl>          <dbl>          <dbl>
##  1 Asia      Afghan…           779.           821.           853.           836.
##  2 Europe    Albania          1601.          1942.          2313.          2760.
##  3 Africa    Algeria          2449.          3014.          2551.          3247.
##  4 Africa    Angola           3521.          3828.          4269.          5523.
##  5 Americas  Argent…          5911.          6857.          7133.          8053.
##  6 Oceania   Austra…         10040.         10950.         12217.         14526.
##  7 Europe    Austria          6137.          8843.         10751.         12835.
##  8 Asia      Bahrain          9867.         11636.         12753.         14805.
##  9 Asia      Bangla…           684.           662.           686.           721.
## 10 Europe    Belgium          8343.          9715.         10991.         13149.
## # ℹ 132 more rows
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>, …
#Orden descendente
datos %>% arrange(desc(gdpPercap_1952))
## # A tibble: 142 × 38
##    continent country gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##    <chr>     <chr>            <dbl>          <dbl>          <dbl>          <dbl>
##  1 Asia      Kuwait         108382.        113523.         95458.         80895.
##  2 Europe    Switze…         14734.         17909.         20431.         22966.
##  3 Americas  United…         13990.         14847.         16173.         19530.
##  4 Americas  Canada          11367.         12490.         13462.         16077.
##  5 Oceania   New Ze…         10557.         12247.         13176.         14464.
##  6 Europe    Norway          10095.         11654.         13450.         16362.
##  7 Oceania   Austra…         10040.         10950.         12217.         14526.
##  8 Europe    United…          9980.         11283.         12477.         14143.
##  9 Asia      Bahrain          9867.         11636.         12753.         14805.
## 10 Europe    Denmark          9692.         11100.         13583.         15937.
## # ℹ 132 more rows
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>, …
#Ordenar por varias columnas
datos %>% arrange(continent,desc(country))
## # A tibble: 142 × 38
##    continent country gdpPercap_1952 gdpPercap_1957 gdpPercap_1962 gdpPercap_1967
##    <chr>     <chr>            <dbl>          <dbl>          <dbl>          <dbl>
##  1 Africa    Zimbab…           407.           519.           527.           570.
##  2 Africa    Zambia           1147.          1312.          1453.          1777.
##  3 Africa    Uganda            735.           774.           767.           909.
##  4 Africa    Tunisia          1468.          1395.          1660.          1932.
##  5 Africa    Togo              860.           926.          1068.          1478.
##  6 Africa    Tanzan…           717.           699.           722.           848.
##  7 Africa    Swazil…          1148.          1245.          1856.          2613.
##  8 Africa    Sudan            1616.          1770.          1960.          1688.
##  9 Africa    South …          4725.          5487.          5769.          7114.
## 10 Africa    Somalia          1136.          1258.          1369.          1285.
## # ℹ 132 more rows
## # ℹ 32 more variables: gdpPercap_1972 <dbl>, gdpPercap_1977 <dbl>,
## #   gdpPercap_1982 <dbl>, gdpPercap_1987 <dbl>, gdpPercap_1992 <dbl>,
## #   gdpPercap_1997 <dbl>, gdpPercap_2002 <dbl>, gdpPercap_2007 <dbl>,
## #   lifeExp_1952 <dbl>, lifeExp_1957 <dbl>, lifeExp_1962 <dbl>,
## #   lifeExp_1967 <dbl>, lifeExp_1972 <dbl>, lifeExp_1977 <dbl>,
## #   lifeExp_1982 <dbl>, lifeExp_1987 <dbl>, lifeExp_1992 <dbl>, …
#Esta última linea indica que se ordenará de forma ascendente por la variable continent y luego ordenara de forma descendente por la variable country.

#Nota: Al ser caracteres el orden es alfabetico

Datos tipo rectangulares

Aun tenemos unos verbos más que aprender, sin embargo, antes de ver los demás, me parece un buen momento para retomar un paso importante nombrano en los parrafos anteriores: tidy.

En nuestro conjunto de datos, que actualmente presenta una estructura “ancha” con columnas separadas para cada año y cada indicador (como gdpPercap_1952, lifeExp_1952, etc.), vamos a realizar una transformación para adoptar un formato “largo” o “rectangular”.

En el formato rectangular, cada fila representará una observación única para un país en un año específico, con columnas dedicadas para year, gdpPercap, lifeExp, y pop.

Función pivot_longer(): Esta función convierte datos de un formato ancho a un formato largo.

#install.packages("tidyr")
library(tidyr)
datos_pivot <- datos %>% 
  pivot_longer(cols = -c(continent, country),
                names_to="indicador",
                values_to = "Valor")  
  • cols = -c(continent, country): Selecciona todas las columnas excepto continent y country para pivotar. El signo - indica que estas columnas se deben excluir del proceso de pivotar.

  • names_to="indicador": Los nombres de las columnas seleccionadas para pivotar se guardarán en una nueva columna llamada indicador.

  • values_to = "Valor": Los valores correspondientes de las columnas pivotadas se almacenarán en una columna llamada Valor

#Observemos nuestros datos
datos_pivot
## # A tibble: 5,112 × 4
##    continent country indicador      Valor
##    <chr>     <chr>   <chr>          <dbl>
##  1 Africa    Algeria gdpPercap_1952 2449.
##  2 Africa    Algeria gdpPercap_1957 3014.
##  3 Africa    Algeria gdpPercap_1962 2551.
##  4 Africa    Algeria gdpPercap_1967 3247.
##  5 Africa    Algeria gdpPercap_1972 4183.
##  6 Africa    Algeria gdpPercap_1977 4910.
##  7 Africa    Algeria gdpPercap_1982 5745.
##  8 Africa    Algeria gdpPercap_1987 5681.
##  9 Africa    Algeria gdpPercap_1992 5023.
## 10 Africa    Algeria gdpPercap_1997 4797.
## # ℹ 5,102 more rows

Aún queda trabajo por hacer, te habras percatado que lo que esta antes del “_” es el nombre del indicador y en el lado derecho se encuentran los años, así que es preferible trabajar con esta información en columnas separadas.

datos_pivot <- datos_pivot %>% 
  separate(indicador,c("indicador","Año"),
                         sep="_")
  • El primer argumento es la columna que va a separar, en este caso es la variable “indicador”.

  • c("indicador", "Año"): Este es un vector de caracteres que define los nombres de las nuevas columnas que se crearán como resultado de la separación.

  • sep = "_": Este argumento especifica el carácter o cadena de caracteres que se utilizará como separador para dividir la columna original.

Probemos con otra forma: Este enfoque es más directo y eficiente que el método anterior que utilizaba primero pivot_longer() y luego separate()

datos %>% pivot_longer(
  cols= -c(continent, country),
  names_to = c("indicador","Año"),
  names_sep = "_",
  values_to = "Valor"
)
## # A tibble: 5,112 × 5
##    continent country indicador Año   Valor
##    <chr>     <chr>   <chr>     <chr> <dbl>
##  1 Africa    Algeria gdpPercap 1952  2449.
##  2 Africa    Algeria gdpPercap 1957  3014.
##  3 Africa    Algeria gdpPercap 1962  2551.
##  4 Africa    Algeria gdpPercap 1967  3247.
##  5 Africa    Algeria gdpPercap 1972  4183.
##  6 Africa    Algeria gdpPercap 1977  4910.
##  7 Africa    Algeria gdpPercap 1982  5745.
##  8 Africa    Algeria gdpPercap 1987  5681.
##  9 Africa    Algeria gdpPercap 1992  5023.
## 10 Africa    Algeria gdpPercap 1997  4797.
## # ℹ 5,102 more rows
  • names_to = c("indicador", "Año"): Aquí se especifica que los nombres de las columnas que se están pivotando se dividirán en dos nuevas columnas: indicador y Año.

  • names_sep = "_": Este argumento indica que el separador entre los elementos que se moverán a las columnas indicador y Año es un guion bajo (_).

Ahora, necesitamos que cada una de las categorias de la variable indicador sean variables independientes. La función pivot_wider() es el opuesto de pivot_longer(), y se utiliza para convertir datos de un formato largo a un formato ancho.

datos_pivot <-  datos_pivot %>% pivot_wider(names_from=c(indicador),values_from = Valor)
  • names_from = c(indicador, Año): Este argumento especifica las columnas del tibble largo cuyos valores se utilizarán para crear los nombres de las nuevas columnas en el tibble ancho.

  • values_from = Valor: Indica que los valores que se colocarán en las nuevas columnas provendrán de la columna Valor del tibble largo.

Para evitar primero aplicar un pivot_longer() y posterior un pivot_wider() se pudo haber realizado en un solo paso y obtener el ismo resultado deseado:

datos_pivot <- datos %>%
  pivot_longer(
    cols = -c(continent, country), 
    names_to = c(".value", "year"), 
    names_pattern = "(.+)_(\\d{4})"
  )
  • cols = -c(continent, country) indica que todas las columnas excepto continent y country deben pivotarse.

  • names_to Este argumento especifica cómo queremos nombrar las nuevas columnas en el conjunto de datos resultante.

  • ".value": Es una palabra clave especial en pivot_longer(). Le dice a la función que parte del nombre original de la columna (en este caso, gdpPercap, lifeExp, pop) debe usarse como nombre de la columna en el nuevo conjunto de datos. No es un nombre literal de columna; es una instrucción para la función sobre cómo manejar parte del nombre de la columna existente.

  • "year": Esto indica que una parte del nombre de la columna original debe ir a una nueva columna llamada year.

  • names_pattern Este argumento es una expresión regular que indica cómo dividir los nombres de las columnas existentes.

  • (.+): Esta es la expresión regular. (.+): El . significa “cualquier carácter”, y + significa “una o más veces”. Por lo tanto, (.+) captura cualquier secuencia de caracteres (en este caso, gdpPercap, lifeExp, pop). Estos caracteres son los que irán a las columnas indicadas por .value en names_to.

  • El guion bajo “_” en la expresión regular actúa como un delimitador que separa claramente el identificador de la parte del año.

  • (\\d{4}): es un guion bajo literal. “\d” significa “un dígito”, y “{4}” significa “repetido cuatro veces”. Así, “(\d{4})”captura una secuencia de cuatro dígitos (en este caso, el año, como 1952, 1957, etc.). Estos dígitos son los que irán a la columna year.

Ahora que ya contamos con los datos en una estructura rectangular, podemos continuar con nuestra manipulación de datos.

Transformar y crear nuevas variables

mutate() no solo facilita la transformación de variables existentes, sino que también es clave en la creación de nuevas variables. Estas nuevas variables pueden ser derivadas de las ya existentes o pueden ser completamente nuevas, basadas en cálculos o reglas específicas definidas por ti.

Hechemos de vista la estructura actual de nuestros datos:

glimpse(datos_pivot)
## Rows: 1,704
## Columns: 6
## $ continent <chr> "Africa", "Africa", "Africa", "Africa", "Africa", "Africa", …
## $ country   <chr> "Algeria", "Algeria", "Algeria", "Algeria", "Algeria", "Alge…
## $ year      <chr> "1952", "1957", "1962", "1967", "1972", "1977", "1982", "198…
## $ gdpPercap <dbl> 2449.0082, 3013.9760, 2550.8169, 3246.9918, 4182.6638, 4910.…
## $ lifeExp   <dbl> 43.077, 45.685, 48.303, 51.407, 54.518, 58.014, 61.368, 65.7…
## $ pop       <dbl> 9279525, 10270856, 11000948, 12760499, 14760787, 17152804, 2…

Las variables continent y country, son variables categoricas debido a que poseen un conjunto fijo y conocido de los valores posibles, es por eso que de preferencia se necesita definir a estas variables como factor, del mismo puedes especificar que una columna es de tipo “fecha”.

Vamos a modificar estas variables sin crear unas nuvevas:

datos_pivot <- datos_pivot %>% mutate(continent=as.factor(continent),
       country=as.factor(country),
       year=as.Date(
                paste(year,"01-01",sep="-")))

Ahora, probemos creando nuevas variables a partir de las que ya se encuentran creadas.

datos_pivot <- datos_pivot %>%
  mutate(log_gdpPercap=log(gdpPercap),
         log_lifeExp=log(lifeExp),
         log_pop=log(pop),
         var_gdpPercap=gdpPercap-lag(gdpPercap),
         varre_gdpPercap=gdpPercap/lag(gdpPercap)-1)

Creemos ahora una nueva variable, tomando como base la clasificación de los países elaborada por el Grupo Banco Mundial (2023):

datos_pivot <- datos_pivot %>%
  mutate(
    clasificacion=
      case_when(
  gdpPercap <= 1136 ~ "Ingreso bajo",
  gdpPercap > 1136 & gdpPercap <= 4466 ~ "Ingreso medio bajo",
  gdpPercap > 4466 & gdpPercap <= 13865 ~ "Ingreso medio alto",
  gdpPercap > 13865 ~ "Ingreso alto"
),
clasificacion=factor(clasificacion, levels =c("Ingreso bajo","Ingreso medio bajo", "Ingreso medio alto", "Ingreso alto"), ordered = TRUE))

Otra función útil que puede combinarse con mutate()es ifelse()

datos_pivot <- datos_pivot %>% mutate(variacion=ifelse(var_gdpPercap>0,"positiva","negativa"))

transmute() El uso de esta función es similar a mutate(), la diferencia radica en que muta y selecciona a la vez, probemos:

datos_pivot %>%
  transmute(country,
    clasificacion=
      case_when(
  gdpPercap <= 1136 ~ "Ingreso bajo",
  gdpPercap > 1136 & gdpPercap <= 4466 ~ "Ingreso medio bajo",
  gdpPercap > 4466 & gdpPercap <= 13865 ~ "Ingreso medio alto",
  gdpPercap > 13865 ~ "Ingreso alto"
),
clasificacion=factor(clasificacion, levels =c("Ingreso bajo","Ingreso medio bajo", "Ingreso medio alto", "Ingreso alto"), ordered = TRUE))
## # A tibble: 1,704 × 2
##    country clasificacion     
##    <fct>   <ord>             
##  1 Algeria Ingreso medio bajo
##  2 Algeria Ingreso medio bajo
##  3 Algeria Ingreso medio bajo
##  4 Algeria Ingreso medio bajo
##  5 Algeria Ingreso medio bajo
##  6 Algeria Ingreso medio alto
##  7 Algeria Ingreso medio alto
##  8 Algeria Ingreso medio alto
##  9 Algeria Ingreso medio alto
## 10 Algeria Ingreso medio alto
## # ℹ 1,694 more rows

Resúmenes

summarise Nos permite crear resúmenes estadísticos.

datos_pivot %>% summarise(
  promedio_lifeExp=mean(lifeExp, na.rm=TRUE),      valor_max_gdp=max(gdpPercap),
  valor_min_gdp=min(gdpPercap),
  mediana=median(gdpPercap)
)
## # A tibble: 1 × 4
##   promedio_lifeExp valor_max_gdp valor_min_gdp mediana
##              <dbl>         <dbl>         <dbl>   <dbl>
## 1             59.5       113523.          241.   3532.

En este caso se utilizó summarise()para casos didacticos, sin embargo, para obtener resumenes estadísticos se utiliza summary()

summary(datos_pivot)
##     continent          country          year              gdpPercap       
##  Africa  :624   Afghanistan:  12   Min.   :1952-01-01   Min.   :   241.2  
##  Americas:300   Albania    :  12   1st Qu.:1965-10-01   1st Qu.:  1202.1  
##  Asia    :396   Algeria    :  12   Median :1979-07-03   Median :  3531.8  
##  Europe  :360   Angola     :  12   Mean   :1979-07-02   Mean   :  7215.3  
##  Oceania : 24   Argentina  :  12   3rd Qu.:1993-04-01   3rd Qu.:  9325.5  
##                 Australia  :  12   Max.   :2007-01-01   Max.   :113523.1  
##                 (Other)    :1632                                          
##     lifeExp           pop            log_gdpPercap     log_lifeExp   
##  Min.   :23.60   Min.   :6.001e+04   Min.   : 5.485   Min.   :3.161  
##  1st Qu.:48.20   1st Qu.:2.794e+06   1st Qu.: 7.092   1st Qu.:3.875  
##  Median :60.71   Median :7.024e+06   Median : 8.170   Median :4.106  
##  Mean   :59.47   Mean   :2.960e+07   Mean   : 8.159   Mean   :4.060  
##  3rd Qu.:70.85   3rd Qu.:1.959e+07   3rd Qu.: 9.141   3rd Qu.:4.261  
##  Max.   :82.60   Max.   :1.319e+09   Max.   :11.640   Max.   :4.414  
##                                                                      
##     log_pop      var_gdpPercap       varre_gdpPercap    
##  Min.   :11.00   Min.   :-50082.39   Min.   :-0.986241  
##  1st Qu.:14.84   1st Qu.:    -7.91   1st Qu.:-0.005812  
##  Median :15.76   Median :   213.79   Median : 0.097120  
##  Mean   :15.77   Mean   :    13.35   Mean   : 0.092898  
##  3rd Qu.:16.79   3rd Qu.:  1219.48   3rd Qu.: 0.197814  
##  Max.   :21.00   Max.   : 85034.21   Max.   :11.585050  
##                  NA's   :1           NA's   :1          
##             clasificacion  variacion        
##  Ingreso bajo      :404   Length:1704       
##  Ingreso medio bajo:558   Class :character  
##  Ingreso medio alto:465   Mode  :character  
##  Ingreso alto      :277                     
##                                             
##                                             
## 

Eso no quiere decir que summarise() no sea útil, de hecho combinandola con group_by() tiene una gran funcionalidad. Para ejemplificar esto, supongamos que queremos obtener el promedio de lifeExp no de forma general sino por cada continente.

datos_pivot %>% 
  group_by(continent) %>% 
  summarise(promedio=mean(lifeExp))
## # A tibble: 5 × 2
##   continent promedio
##   <fct>        <dbl>
## 1 Africa        48.9
## 2 Americas      64.7
## 3 Asia          60.1
## 4 Europe        71.9
## 5 Oceania       74.3

Otro ejemplo:

datos_pivot %>% 
  group_by(continent,year) %>% 
  summarise(promedio=mean(lifeExp))
## `summarise()` has grouped output by 'continent'. You can override using the
## `.groups` argument.
## # A tibble: 60 × 3
## # Groups:   continent [5]
##    continent year       promedio
##    <fct>     <date>        <dbl>
##  1 Africa    1952-01-01     39.1
##  2 Africa    1957-01-01     41.3
##  3 Africa    1962-01-01     43.3
##  4 Africa    1967-01-01     45.3
##  5 Africa    1972-01-01     47.5
##  6 Africa    1977-01-01     49.6
##  7 Africa    1982-01-01     51.6
##  8 Africa    1987-01-01     53.3
##  9 Africa    1992-01-01     53.6
## 10 Africa    1997-01-01     53.6
## # ℹ 50 more rows

Resúmenes agrupados

group_by()se puede adaptar para las otras funciones que hemos visto y para muchas más, probemos con count(), que tal si contamos cuantas países por continente constan en nuestros datos:

datos_pivot %>% 
  group_by(continent) %>% 
  distinct(country) %>% 
  count()
## # A tibble: 5 × 2
## # Groups:   continent [5]
##   continent     n
##   <fct>     <int>
## 1 Africa       52
## 2 Americas     25
## 3 Asia         33
## 4 Europe       30
## 5 Oceania       2

Unión de datos

En el análisis de datos, a menudo nos encontramos con la necesidad de integrar información de distintos marcos de datos. Afortunadamente, R ofrece varias herramientas para esto, entre ellas los joins, que son parte integral del paquete dplyr.

Al realizar uniones entre diferentes conjuntos de datos, es crucial tener una “clave” o “llave”, es decir, una columna en cada marco de datos que sirva como identificador único para cada observación. Un buen ejemplo de esto son los nombres de los países.

En esta sección vamos a ver el uso de: inner_join(), left_join(), rigth_join()y full_join()

Se puede hacer uso de los joinspara filtras nuestras observaciones, con semi_join y anti_join.

Para mostrar el uso de estas funciones, utilizaremos el conjunto de datos denominado desempleo y nuestros datos manipulados datos_pivot.

print(desempleo)
## # A tibble: 2,562 × 9
##    iso2c iso3c country  date SL.UEM.TOTL.ZS unit  obs_status footnote
##    <chr> <chr> <chr>   <dbl>          <dbl> <chr> <chr>      <chr>   
##  1 AW    ABW   Aruba    1960             NA <NA>  <NA>       <NA>    
##  2 AW    ABW   Aruba    1961             NA <NA>  <NA>       <NA>    
##  3 AW    ABW   Aruba    1962             NA <NA>  <NA>       <NA>    
##  4 AW    ABW   Aruba    1963             NA <NA>  <NA>       <NA>    
##  5 AW    ABW   Aruba    1964             NA <NA>  <NA>       <NA>    
##  6 AW    ABW   Aruba    1965             NA <NA>  <NA>       <NA>    
##  7 AW    ABW   Aruba    1966             NA <NA>  <NA>       <NA>    
##  8 AW    ABW   Aruba    1967             NA <NA>  <NA>       <NA>    
##  9 AW    ABW   Aruba    1968             NA <NA>  <NA>       <NA>    
## 10 AW    ABW   Aruba    1969             NA <NA>  <NA>       <NA>    
## # ℹ 2,552 more rows
## # ℹ 1 more variable: last_updated <date>
#Seleccionemos la variables de interes y cambiemos uno de los nombres de las variables
desempleo <- desempleo %>%     
  select(country,date,SL.UEM.TOTL.ZS) %>%  
  rename(tasa_desem=SL.UEM.TOTL.ZS) %>% 
  mutate(date=as.Date(paste(date,"01-01",sep="-")))

#Nota: rename() es otra de las funciones de dplyr, se utiliza para renombrar variables, la sintexis es rename(nombre_nuevo=nombre_viejo).

#El siguiente código ayuda a quitar el comentario de la columna
attributes(desempleo$tasa_desem) <- NULL

Intersección de observaciones

inner_join()Esta función se utiliza para traer observaciones que coinciden en los dos marcos de datos.

Es crucial recordar que, para realizar uniones efectivas, las claves utilizadas deben ser del mismo tipo de datos. Por ejemplo, si una clave en un conjunto de datos es una fecha y en otro es un texto, no se podrán unir correctamente.

datos_pivot %>% inner_join(desempleo,        by=c("country"))%>%
relocate(tasa_desem, .after= year)
## Warning in inner_join(., desempleo, by = c("country")): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 625 of `x` matches multiple rows in `y`.
## ℹ Row 62 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
##   "many-to-many"` to silence this warning.
## # A tibble: 16,104 × 15
##    continent country   year       tasa_desem gdpPercap lifeExp      pop
##    <fct>     <chr>     <date>          <dbl>     <dbl>   <dbl>    <dbl>
##  1 Americas  Argentina 1952-01-01         NA     5911.    62.5 17876956
##  2 Americas  Argentina 1952-01-01         NA     5911.    62.5 17876956
##  3 Americas  Argentina 1952-01-01         NA     5911.    62.5 17876956
##  4 Americas  Argentina 1952-01-01         NA     5911.    62.5 17876956
##  5 Americas  Argentina 1952-01-01         NA     5911.    62.5 17876956
##  6 Americas  Argentina 1952-01-01         NA     5911.    62.5 17876956
##  7 Americas  Argentina 1952-01-01         NA     5911.    62.5 17876956
##  8 Americas  Argentina 1952-01-01         NA     5911.    62.5 17876956
##  9 Americas  Argentina 1952-01-01         NA     5911.    62.5 17876956
## 10 Americas  Argentina 1952-01-01         NA     5911.    62.5 17876956
## # ℹ 16,094 more rows
## # ℹ 8 more variables: log_gdpPercap <dbl>, log_lifeExp <dbl>, log_pop <dbl>,
## #   var_gdpPercap <dbl>, varre_gdpPercap <dbl>, clasificacion <ord>,
## #   variacion <chr>, date <date>
  • La unión de nuestros datos resulta en una relación “many-to-many”, ya que la clave (el nombre del país) se repite debido a registros anuales por país. Esto conlleva una combinación de múltiples filas para cada país de ambos conjuntos de datos.

  • En este caso, para evitar la combinación de “many-to-many” y asegurar que la unión refleje con precisión las relaciones entre los datos vamos a utilizar claves más específicas.

datos_pivot %>% inner_join(desempleo,        by=c("country","year"="date"))%>%
relocate(tasa_desem, .after= year) 
## # A tibble: 220 × 14
##    continent country   year       tasa_desem gdpPercap lifeExp      pop
##    <fct>     <chr>     <date>          <dbl>     <dbl>   <dbl>    <dbl>
##  1 Americas  Argentina 1962-01-01      NA        7133.    65.1 21283783
##  2 Americas  Argentina 1967-01-01      NA        8053.    65.6 22934225
##  3 Americas  Argentina 1972-01-01      NA        9443.    67.1 24779799
##  4 Americas  Argentina 1977-01-01      NA       10079.    68.5 26983828
##  5 Americas  Argentina 1982-01-01      NA        8998.    69.9 29341374
##  6 Americas  Argentina 1987-01-01      NA        9140.    70.8 31620918
##  7 Americas  Argentina 1992-01-01       6.36     9308.    71.9 33958947
##  8 Americas  Argentina 1997-01-01      14.8     10967.    73.3 36203463
##  9 Americas  Argentina 2002-01-01      19.6      8798.    74.3 38331121
## 10 Americas  Argentina 2007-01-01       8.47    12779.    75.3 40301927
## # ℹ 210 more rows
## # ℹ 7 more variables: log_gdpPercap <dbl>, log_lifeExp <dbl>, log_pop <dbl>,
## #   var_gdpPercap <dbl>, varre_gdpPercap <dbl>, clasificacion <ord>,
## #   variacion <chr>

NOTA Para unir nuestros datos, usamos “country” como clave común en ambos tibbles. Sin embargo, hay una diferencia en cómo se registran los años: en datos_pivot es year, mientras que en desempleo es date. Por ello, es crucial especificar estas columnas correspondientes en la función de unión para asegurar una combinación correcta.

Combinaciones de izquierda

left_join() Mantiene todas las filas del primer conjunto de datos (izquierdo) y añadiendo las columnas del segundo conjunto de datos (derecho) cuando las claves coinciden. Las filas del conjunto de datos izquierdo que no tienen coincidencia en el derecho se mantienen, con los valores del derecho puestos como NA en las columnas añadidas.

datos_pivot %>% left_join(desempleo,         by=c("country","year"="date"))%>%
relocate(tasa_desem, .after= year)
## # A tibble: 1,704 × 14
##    continent country year       tasa_desem gdpPercap lifeExp      pop
##    <fct>     <chr>   <date>          <dbl>     <dbl>   <dbl>    <dbl>
##  1 Africa    Algeria 1952-01-01         NA     2449.    43.1  9279525
##  2 Africa    Algeria 1957-01-01         NA     3014.    45.7 10270856
##  3 Africa    Algeria 1962-01-01         NA     2551.    48.3 11000948
##  4 Africa    Algeria 1967-01-01         NA     3247.    51.4 12760499
##  5 Africa    Algeria 1972-01-01         NA     4183.    54.5 14760787
##  6 Africa    Algeria 1977-01-01         NA     4910.    58.0 17152804
##  7 Africa    Algeria 1982-01-01         NA     5745.    61.4 20033753
##  8 Africa    Algeria 1987-01-01         NA     5681.    65.8 23254956
##  9 Africa    Algeria 1992-01-01         NA     5023.    67.7 26298373
## 10 Africa    Algeria 1997-01-01         NA     4797.    69.2 29072015
## # ℹ 1,694 more rows
## # ℹ 7 more variables: log_gdpPercap <dbl>, log_lifeExp <dbl>, log_pop <dbl>,
## #   var_gdpPercap <dbl>, varre_gdpPercap <dbl>, clasificacion <ord>,
## #   variacion <chr>

Combinaciones de derecha

right_join() Conserva todas las filas del conjunto de datos derecho y añadiendo columnas del izquierdo donde coincidan las claves. Las filas del conjunto derecho sin correspondencia en el izquierdo se mantienen, con valores NA en las nuevas columnas.

datos_pivot %>% right_join(desempleo,        by=c("country","year"="date"))%>%
relocate(tasa_desem, .after= year)
## # A tibble: 2,562 × 14
##    continent country   year       tasa_desem gdpPercap lifeExp      pop
##    <fct>     <chr>     <date>          <dbl>     <dbl>   <dbl>    <dbl>
##  1 Americas  Argentina 1962-01-01      NA        7133.    65.1 21283783
##  2 Americas  Argentina 1967-01-01      NA        8053.    65.6 22934225
##  3 Americas  Argentina 1972-01-01      NA        9443.    67.1 24779799
##  4 Americas  Argentina 1977-01-01      NA       10079.    68.5 26983828
##  5 Americas  Argentina 1982-01-01      NA        8998.    69.9 29341374
##  6 Americas  Argentina 1987-01-01      NA        9140.    70.8 31620918
##  7 Americas  Argentina 1992-01-01       6.36     9308.    71.9 33958947
##  8 Americas  Argentina 1997-01-01      14.8     10967.    73.3 36203463
##  9 Americas  Argentina 2002-01-01      19.6      8798.    74.3 38331121
## 10 Americas  Argentina 2007-01-01       8.47    12779.    75.3 40301927
## # ℹ 2,552 more rows
## # ℹ 7 more variables: log_gdpPercap <dbl>, log_lifeExp <dbl>, log_pop <dbl>,
## #   var_gdpPercap <dbl>, varre_gdpPercap <dbl>, clasificacion <ord>,
## #   variacion <chr>

Combinación completa

full_join() Mantiene todas las filas de ambos, y llenando con NA las no coincidencias.

datos_pivot %>% full_join(desempleo,         by=c("country","year"="date"))%>%
relocate(tasa_desem, .after= year) 
## # A tibble: 4,046 × 14
##    continent country year       tasa_desem gdpPercap lifeExp      pop
##    <fct>     <chr>   <date>          <dbl>     <dbl>   <dbl>    <dbl>
##  1 Africa    Algeria 1952-01-01         NA     2449.    43.1  9279525
##  2 Africa    Algeria 1957-01-01         NA     3014.    45.7 10270856
##  3 Africa    Algeria 1962-01-01         NA     2551.    48.3 11000948
##  4 Africa    Algeria 1967-01-01         NA     3247.    51.4 12760499
##  5 Africa    Algeria 1972-01-01         NA     4183.    54.5 14760787
##  6 Africa    Algeria 1977-01-01         NA     4910.    58.0 17152804
##  7 Africa    Algeria 1982-01-01         NA     5745.    61.4 20033753
##  8 Africa    Algeria 1987-01-01         NA     5681.    65.8 23254956
##  9 Africa    Algeria 1992-01-01         NA     5023.    67.7 26298373
## 10 Africa    Algeria 1997-01-01         NA     4797.    69.2 29072015
## # ℹ 4,036 more rows
## # ℹ 7 more variables: log_gdpPercap <dbl>, log_lifeExp <dbl>, log_pop <dbl>,
## #   var_gdpPercap <dbl>, varre_gdpPercap <dbl>, clasificacion <ord>,
## #   variacion <chr>

Ya para finalizar, recuerdas que en secciones anteriores vimos como filtrar datos según tus condiciones, esto tambien se puede realizar con los joins.

Filtrar observaciones con joins

semi_join() Selecciona todas las filas del primer conjunto de datos (izquierdo) que tienen una coincidencia en el segundo conjunto (derecho), basándose en una clave común. No añade nuevas columnas, solo filtra filas.

datos_pivot %>% semi_join(desempleo,        by=c("country","year"="date"))
## # A tibble: 220 × 13
##    continent country   year       gdpPercap lifeExp      pop log_gdpPercap
##    <fct>     <fct>     <date>         <dbl>   <dbl>    <dbl>         <dbl>
##  1 Americas  Argentina 1962-01-01     7133.    65.1 21283783          8.87
##  2 Americas  Argentina 1967-01-01     8053.    65.6 22934225          8.99
##  3 Americas  Argentina 1972-01-01     9443.    67.1 24779799          9.15
##  4 Americas  Argentina 1977-01-01    10079.    68.5 26983828          9.22
##  5 Americas  Argentina 1982-01-01     8998.    69.9 29341374          9.10
##  6 Americas  Argentina 1987-01-01     9140.    70.8 31620918          9.12
##  7 Americas  Argentina 1992-01-01     9308.    71.9 33958947          9.14
##  8 Americas  Argentina 1997-01-01    10967.    73.3 36203463          9.30
##  9 Americas  Argentina 2002-01-01     8798.    74.3 38331121          9.08
## 10 Americas  Argentina 2007-01-01    12779.    75.3 40301927          9.46
## # ℹ 210 more rows
## # ℹ 6 more variables: log_lifeExp <dbl>, log_pop <dbl>, var_gdpPercap <dbl>,
## #   varre_gdpPercap <dbl>, clasificacion <ord>, variacion <chr>

Como podrás observar, obtenemos sola las observaciones de los países latinos, debido a que solo esos constan en el tibble desempleo.

anti_join() Devuelve todas las filas del primer conjunto de datos (izquierdo) que no tienen una coincidencia en el segundo conjunto (derecho), basándose en una clave común.

datos_pivot %>% anti_join(desempleo,        by=c("country","year"="date"))
## # A tibble: 1,484 × 13
##    continent country year       gdpPercap lifeExp      pop log_gdpPercap
##    <fct>     <fct>   <date>         <dbl>   <dbl>    <dbl>         <dbl>
##  1 Africa    Algeria 1952-01-01     2449.    43.1  9279525          7.80
##  2 Africa    Algeria 1957-01-01     3014.    45.7 10270856          8.01
##  3 Africa    Algeria 1962-01-01     2551.    48.3 11000948          7.84
##  4 Africa    Algeria 1967-01-01     3247.    51.4 12760499          8.09
##  5 Africa    Algeria 1972-01-01     4183.    54.5 14760787          8.34
##  6 Africa    Algeria 1977-01-01     4910.    58.0 17152804          8.50
##  7 Africa    Algeria 1982-01-01     5745.    61.4 20033753          8.66
##  8 Africa    Algeria 1987-01-01     5681.    65.8 23254956          8.64
##  9 Africa    Algeria 1992-01-01     5023.    67.7 26298373          8.52
## 10 Africa    Algeria 1997-01-01     4797.    69.2 29072015          8.48
## # ℹ 1,474 more rows
## # ℹ 6 more variables: log_lifeExp <dbl>, log_pop <dbl>, var_gdpPercap <dbl>,
## #   varre_gdpPercap <dbl>, clasificacion <ord>, variacion <chr>

Se obtiene las observaciones de los países que no son latinos, debido a que estos no contan en el tibble desempleo.

Ejercicios

  1. En el proceso de importación de datos, hemos cargado tres marcos de datos diferentes “electricidad”,“pib” e “IDH”. Para entender mejor su estructura, analiza si estos marcos de datos se ajustan al concepto de datos rectangulares. Si encuentras que alguno de los marcos de datos no cumple con esta estructura, te desafío a transformarlo de manera que se convierta en un conjunto de datos rectangular.

  2. En el marco de datos “pib” y en “electricidad” existen variables que realmente no aportan información, ¿puedes seleccionar solamente las variables que son de interés?

  3. Tenemos tres marcos de datos, cada uno con variables clave sobre diferentes países. El objetivo es combinarlos en un único marco de datos (tibble) para centralizar y facilitar el análisis. Asegúrate de que la integración mantenga la coherencia y relevancia de las variables de cada país.

  4. En nuestro rol como analistas, se nos ha asignado una tarea específica: revisar y analizar las variables disponibles que corresponden exclusivamente a los países latinoamericanos. Este enfoque selectivo es crucial para centrar nuestro análisis en esta región particular. ¿Qué código ejecutarías para cumplir con esto?

  5. Al analizar el marco de datos, hemos identificado que algunas columnas clasificadas como tipo carácter deberían ser numéricas para una correcta interpretación y análisis. Esta discrepancia puede afectar significativamente la precisión de nuestro análisis. Por lo tanto, es esencial realizar una transformación de estos campos para corregir su tipo de dato.

  6. ¿Cuál o cuáles países de América Latina, durante el año 2020, cumplen con las siguientes condiciones económicas y de desarrollo? Buscamos identificar aquellos países que no solo han alcanzado un PIB per cápita superior a 5000 dólares, sino que también han logrado una cobertura de electricidad que supera el 50% de su población. Adicionalmente, estos países deben estar clasificados dentro de la categoría de ‘IDH Medio’ según los estándares internacionales.

  7. ¿Podrías determinar cuál es el valor promedio del Índice de Desarrollo Humano (IDH) entre todos los países de América Latina?