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
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:
## [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:
Recuerda que tienes que usar \\ o /, además toda la ruta debe estar dentro de las comillas.
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:
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.
Importar datos de ficheros Stata
Para importar datos de extensión .dta o .sav se necesita el siguiente paquete:
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:
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”.
## [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:
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:
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:
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 proporcionadahtml_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:
Puedes utrilizar el paquete de la siguiente manera:
## # 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>
## # 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>
## # 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>
## # 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.
Los verbos principales que integran sus funciones son:
filter(),select(),arrange(),mutate(),summarise()ygroup_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)
## # 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.
## # 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>, …
## # 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.
## # 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>, …
## # 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
## # 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>, …
## # 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>, …
## # 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:
## # 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:
## # 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>, …
## # 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>, …
## # 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>, …
## # 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:
## # 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>
## # 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>
## # 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
## # 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>, …
## # 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>, …
## # 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>, …
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
## # 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.
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.
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_toEste 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_patternEste 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:
## 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()
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()
## 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.
## # 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:
## `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:
## # 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.
## # 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) <- NULLIntersecció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.
## 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.
## # 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.
## # 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
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.
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?
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.
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?
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.
¿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.
¿Podrías determinar cuál es el valor promedio del Índice de Desarrollo Humano (IDH) entre todos los países de América Latina?