Tutorial: introducción a {dplyr} con datos de población
Por Bastián Olea Herrera en Tutoriales
8/11/2024
Este post es una introducción al paquete {dplyr}
para la exploración y análisis de datos con R. Está dirigido a principiantes de R. Si es primera vez que usas R, te recomiendo revisar primero
este breve tutorial inicial de R..
En este tutorial veremos:
- carga de datos de Excel
- seleccionar columnas
- ordenar tablas de datos
- seleccionar filas de una tabla de datos
- filtrar datos
Los datos usados en este tutorial son las Proyecciones de población para 2024 de Chile, calculadas por el Instituto Nacional de Estadísticas (INE). La obtención, procesamiento y visualización de estos datos puede encontrarse en este repositorio, junto a una aplicación web desarrollada en R para visualizar los datos.
Instalación de paquetes
Los paquetes son conjuntos de funciones, programas, datos y documentación que sirven para potenciar R. Para poder usarlos, primero hay que instalarlos en nuestro computador usando la función install.packages()
. Luego de instalarlos, simplemente los cargamos usando library()
.
# es necesario instalarlos una sola vez
install.packages("dplyr")
install.packages("readxl")
Luego cargamos los paquetes:
library(dplyr) # manipulación de datos
library(readxl) # carga de archivos Excel
{dplyr}
es un paquete parte del Tidyverse, que se usa para manipular datos a partir de funciones que emulan instrucciones sencillas, como seleccionar, filtrar, etc.
Cargar datos
Antes que nada, debemos descargar el archivo que usaremos para el tutorial:
clic aquí para descargar el archivo Excel censo_proyeccion_2024.xlsx
Importamos los datos que usaremos con la funcion read_excel()
, cuyo argumento es el nombre del archivo. Asignamos el resultado a un objeto, y así tenemos nuetros datos de Excel cargados en R:
censo <- read_excel("censo_proyeccion_2024.xlsx") # cargar
censo # ver los datos de dataframe o tabla
# A tibble: 346 × 7
cut_region region cut_provincia provincia cut_comuna comuna población
<dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl>
1 1 Tarapacá 11 Iquique 1101 Iquique 231962
2 1 Tarapacá 11 Iquique 1107 Alto H… 143294
3 1 Tarapacá 14 Tamarugal 1401 Pozo A… 18713
4 1 Tarapacá 14 Tamarugal 1402 Camiña 1374
5 1 Tarapacá 14 Tamarugal 1403 Colcha… 1558
6 1 Tarapacá 14 Tamarugal 1404 Huara 3095
7 1 Tarapacá 14 Tamarugal 1405 Pica 6291
8 2 Antofagasta 21 Antofagasta 2101 Antofa… 444276
9 2 Antofagasta 21 Antofagasta 2102 Mejill… 15877
10 2 Antofagasta 21 Antofagasta 2103 Sierra… 1800
# ℹ 336 more rows
Para ver más filas del dataframe, usamos la función print()
:
print(censo, n = 20)
# A tibble: 346 × 7
cut_region region cut_provincia provincia cut_comuna comuna población
<dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl>
1 1 Tarapacá 11 Iquique 1101 Iquique 231962
2 1 Tarapacá 11 Iquique 1107 Alto H… 143294
3 1 Tarapacá 14 Tamarugal 1401 Pozo A… 18713
4 1 Tarapacá 14 Tamarugal 1402 Camiña 1374
5 1 Tarapacá 14 Tamarugal 1403 Colcha… 1558
6 1 Tarapacá 14 Tamarugal 1404 Huara 3095
7 1 Tarapacá 14 Tamarugal 1405 Pica 6291
8 2 Antofagasta 21 Antofagasta 2101 Antofa… 444276
9 2 Antofagasta 21 Antofagasta 2102 Mejill… 15877
10 2 Antofagasta 21 Antofagasta 2103 Sierra… 1800
11 2 Antofagasta 21 Antofagasta 2104 Taltal 13967
12 2 Antofagasta 22 El Loa 2201 Calama 196152
13 2 Antofagasta 22 El Loa 2202 Ollagüe 269
14 2 Antofagasta 22 El Loa 2203 San Pe… 11030
15 2 Antofagasta 23 Tocopilla 2301 Tocopi… 28354
16 2 Antofagasta 23 Tocopilla 2302 María … 6507
17 3 Atacama 31 Copiapó 3101 Copiapó 176100
18 3 Atacama 31 Copiapó 3102 Caldera 19964
19 3 Atacama 31 Copiapó 3103 Tierra… 14431
20 3 Atacama 32 Chañaral 3201 Chañar… 13017
# ℹ 326 more rows
Ahora que tenemos nuestros datos cargados como un objeto en nuestro entorno de R, podemos empezar a manipularlo y explorarlo usando {dplyr}
.
Seleccionar columnas
La función select()
selecciona columnas del dataframe.
censo |> # comando + shift + M
select(comuna, población)
# A tibble: 346 × 2
comuna población
<chr> <dbl>
1 Iquique 231962
2 Alto Hospicio 143294
3 Pozo Almonte 18713
4 Camiña 1374
5 Colchane 1558
6 Huara 3095
7 Pica 6291
8 Antofagasta 444276
9 Mejillones 15877
10 Sierra Gorda 1800
# ℹ 336 more rows
El operador |>
es un conector, y significa que a este objeto le hago esto otro; es decir, se lee como si dijera “luego” o “entonces”. En este caso: a censo
le selecciono comuna
y población
.
Podemos seleccionar negativamente; es decir, excluir ciertas columnas
censo |>
select(-cut_provincia, -cut_comuna, -cut_region)
# A tibble: 346 × 4
region provincia comuna población
<chr> <chr> <chr> <dbl>
1 Tarapacá Iquique Iquique 231962
2 Tarapacá Iquique Alto Hospicio 143294
3 Tarapacá Tamarugal Pozo Almonte 18713
4 Tarapacá Tamarugal Camiña 1374
5 Tarapacá Tamarugal Colchane 1558
6 Tarapacá Tamarugal Huara 3095
7 Tarapacá Tamarugal Pica 6291
8 Antofagasta Antofagasta Antofagasta 444276
9 Antofagasta Antofagasta Mejillones 15877
10 Antofagasta Antofagasta Sierra Gorda 1800
# ℹ 336 more rows
También podemos seleccionar columnas en base a sus nombres parciales:
censo |>
select(-contains("cut"))
# A tibble: 346 × 4
region provincia comuna población
<chr> <chr> <chr> <dbl>
1 Tarapacá Iquique Iquique 231962
2 Tarapacá Iquique Alto Hospicio 143294
3 Tarapacá Tamarugal Pozo Almonte 18713
4 Tarapacá Tamarugal Camiña 1374
5 Tarapacá Tamarugal Colchane 1558
6 Tarapacá Tamarugal Huara 3095
7 Tarapacá Tamarugal Pica 6291
8 Antofagasta Antofagasta Antofagasta 444276
9 Antofagasta Antofagasta Mejillones 15877
10 Antofagasta Antofagasta Sierra Gorda 1800
# ℹ 336 more rows
Selección de columnas por el numero de una columna (su posición):
censo |>
select(1:3, población)
# A tibble: 346 × 4
cut_region region cut_provincia población
<dbl> <chr> <dbl> <dbl>
1 1 Tarapacá 11 231962
2 1 Tarapacá 11 143294
3 1 Tarapacá 14 18713
4 1 Tarapacá 14 1374
5 1 Tarapacá 14 1558
6 1 Tarapacá 14 3095
7 1 Tarapacá 14 6291
8 2 Antofagasta 21 444276
9 2 Antofagasta 21 15877
10 2 Antofagasta 21 1800
# ℹ 336 more rows
Ordenar filas
Usamos la función arrange()
para ordenar las filas de nuestros datos de acuerdo a otra variable:
censo |>
arrange(población) |>
select(comuna, población)
# A tibble: 346 × 2
comuna población
<chr> <dbl>
1 Antártica 151
2 Río Verde 205
3 Laguna Blanca 248
4 Ollagüe 269
5 Timaukel 276
6 Tortel 585
7 San Gregorio 651
8 Primavera 674
9 O'Higgins 675
10 General Lagos 801
# ℹ 336 more rows
Ordenar de mayor a menor:
censo |>
arrange(desc(población)) |>
select(region, comuna, población)
# A tibble: 346 × 3
region comuna población
<chr> <chr> <dbl>
1 Metropolitana de Santiago Puente Alto 667904
2 Metropolitana de Santiago Maipú 586812
3 Metropolitana de Santiago Santiago 544388
4 Antofagasta Antofagasta 444276
5 Metropolitana de Santiago La Florida 407297
6 Valparaíso Viña del Mar 371490
7 Metropolitana de Santiago San Bernardo 348640
8 Metropolitana de Santiago Las Condes 343632
9 Valparaíso Valparaíso 320816
10 La Araucanía Temuco 309696
# ℹ 336 more rows
Ordenar por dos variables a la vez
censo |>
arrange(region, desc(población)) |>
select(region, comuna, población) |>
print(n = 20)
# A tibble: 346 × 3
region comuna población
<chr> <chr> <dbl>
1 Antofagasta Antofagasta 444276
2 Antofagasta Calama 196152
3 Antofagasta Tocopilla 28354
4 Antofagasta Mejillones 15877
5 Antofagasta Taltal 13967
6 Antofagasta San Pedro de Atacama 11030
7 Antofagasta María Elena 6507
8 Antofagasta Sierra Gorda 1800
9 Antofagasta Ollagüe 269
10 Arica y Parinacota Arica 257163
11 Arica y Parinacota Putre 2569
12 Arica y Parinacota Camarones 1246
13 Arica y Parinacota General Lagos 801
14 Atacama Copiapó 176100
15 Atacama Vallenar 57360
16 Atacama Caldera 19964
17 Atacama Tierra Amarilla 14431
18 Atacama Diego de Almagro 13909
19 Atacama Chañaral 13017
20 Atacama Huasco 11590
# ℹ 326 more rows
Filtrar datos
Con la función filter()
podemos filtrar nuestro dataframe a partir de una comparación, dejando solamente las filas del dataframe que cumplan con la comparación.
Por ejemplo, dejar sólo las filas donde la comuna sea “Providencia”:
censo |> filter(comuna == "Providencia")
# A tibble: 1 × 7
cut_region region cut_provincia provincia cut_comuna comuna población
<dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl>
1 13 Metropolitana … 131 Santiago 13123 Provi… 164009
Excluir las filas donde la columna sea “Alto Hospicio”:
censo |> filter(comuna != "Alto Hospicio")
# A tibble: 345 × 7
cut_region region cut_provincia provincia cut_comuna comuna población
<dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl>
1 1 Tarapacá 11 Iquique 1101 Iquique 231962
2 1 Tarapacá 14 Tamarugal 1401 Pozo A… 18713
3 1 Tarapacá 14 Tamarugal 1402 Camiña 1374
4 1 Tarapacá 14 Tamarugal 1403 Colcha… 1558
5 1 Tarapacá 14 Tamarugal 1404 Huara 3095
6 1 Tarapacá 14 Tamarugal 1405 Pica 6291
7 2 Antofagasta 21 Antofagasta 2101 Antofa… 444276
8 2 Antofagasta 21 Antofagasta 2102 Mejill… 15877
9 2 Antofagasta 21 Antofagasta 2103 Sierra… 1800
10 2 Antofagasta 21 Antofagasta 2104 Taltal 13967
# ℹ 335 more rows
Dejar sólo las observaciones donde la población sea mayor a un valor:
censo |> filter(población > 300000)
# A tibble: 10 × 7
cut_region region cut_provincia provincia cut_comuna comuna población
<dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl>
1 2 Antofagasta 21 Antofaga… 2101 Antof… 444276
2 5 Valparaíso 51 Valparaí… 5101 Valpa… 320816
3 5 Valparaíso 51 Valparaí… 5109 Viña … 371490
4 9 La Araucanía 91 Cautín 9101 Temuco 309696
5 13 Metropolitana… 131 Santiago 13101 Santi… 544388
6 13 Metropolitana… 131 Santiago 13110 La Fl… 407297
7 13 Metropolitana… 131 Santiago 13114 Las C… 343632
8 13 Metropolitana… 131 Santiago 13119 Maipú 586812
9 13 Metropolitana… 132 Cordille… 13201 Puent… 667904
10 13 Metropolitana… 134 Maipo 13401 San B… 348640
Población menor a 1000, sólo dejar comuna y población, y ordenar de menor a mayor:
censo |>
filter(población < 1000) |>
select(comuna, población) |>
arrange(población)
# A tibble: 11 × 2
comuna población
<chr> <dbl>
1 Antártica 151
2 Río Verde 205
3 Laguna Blanca 248
4 Ollagüe 269
5 Timaukel 276
6 Tortel 585
7 San Gregorio 651
8 Primavera 674
9 O'Higgins 675
10 General Lagos 801
11 Lago Verde 914
Podemos hacer filtros usando funciones que operen sobre las columnas, por ejemplo, para filtrar las filas donde la población sea igual al mínimo de población:
censo |>
filter(población == min(población)) |>
select(region, comuna, provincia, población)
# A tibble: 1 × 4
region comuna provincia población
<chr> <chr> <chr> <dbl>
1 Magallanes y de la Antártica Chilena Antártica Antártica Chilena 151
Un caso más útil sería filtrar los casos donde la población sea mayor o igual al promedio de población:
censo |>
filter(población >= mean(población)) |>
select(region, comuna, provincia, población)
# A tibble: 84 × 4
region comuna provincia población
<chr> <chr> <chr> <dbl>
1 Tarapacá Iquique Iquique 231962
2 Tarapacá Alto Hospicio Iquique 143294
3 Antofagasta Antofagasta Antofagasta 444276
4 Antofagasta Calama El Loa 196152
5 Atacama Copiapó Copiapó 176100
6 Coquimbo La Serena Elqui 267400
7 Coquimbo Coquimbo Elqui 275644
8 Coquimbo Ovalle Limarí 124401
9 Valparaíso Valparaíso Valparaíso 320816
10 Valparaíso Viña del Mar Valparaíso 371490
# ℹ 74 more rows
También es posible filtrar usando objetos que creamos con anterioridad:
min_pob <- 25000
max_pob <- 30000
censo |>
filter(población > min_pob,
población < max_pob) |>
select(población, comuna, provincia, region)
# A tibble: 16 × 4
población comuna provincia region
<dbl> <chr> <chr> <chr>
1 28354 Tocopilla Tocopilla Antofagasta
2 29916 Salamanca Choapa Coquimbo
3 27898 La Cruz Quillota Valparaíso
4 27065 Cartagena San Antonio Valparaíso
5 27286 Llaillay San Felipe Valparaíso
6 27749 Las Cabras Cachapoal Libertador General Bernardo O'Higgins
7 28552 Mostazal Cachapoal Libertador General Bernardo O'Higgins
8 26746 Hualqui Concepción Biobío
9 27152 Lebu Arauco Biobío
10 28028 Nacimiento Bíobío Biobío
11 25515 Carahue Cautín La Araucanía
12 25488 Freire Cautín La Araucanía
13 26617 Pitrufquen Cautín La Araucanía
14 26558 Collipulli Malleco La Araucanía
15 25218 Aysén Aysén Aysén del General Carlos Ibáñez del Campo
16 29067 Coihueco Punilla Ñuble
Del mismo modo, podemos filtrar usando la cifra del promedio de población:
promedio <- mean(censo$población)
censo |>
filter(población > promedio)
# A tibble: 84 × 7
cut_region region cut_provincia provincia cut_comuna comuna población
<dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl>
1 1 Tarapacá 11 Iquique 1101 Iquique 231962
2 1 Tarapacá 11 Iquique 1107 Alto H… 143294
3 2 Antofagasta 21 Antofagasta 2101 Antofa… 444276
4 2 Antofagasta 22 El Loa 2201 Calama 196152
5 3 Atacama 31 Copiapó 3101 Copiapó 176100
6 4 Coquimbo 41 Elqui 4101 La Ser… 267400
7 4 Coquimbo 41 Elqui 4102 Coquim… 275644
8 4 Coquimbo 43 Limarí 4301 Ovalle 124401
9 5 Valparaíso 51 Valparaíso 5101 Valpar… 320816
10 5 Valparaíso 51 Valparaíso 5109 Viña d… 371490
# ℹ 74 more rows
Seleccionar filas
Usamos slice()
para seleccionar filas específicas del dataframe:
censo |>
slice(200:220) # filas del 200 al 220
# A tibble: 21 × 7
cut_region region cut_provincia provincia cut_comuna comuna población
<dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl>
1 9 La Araucanía 92 Malleco 9205 Lonqui… 11109
2 9 La Araucanía 92 Malleco 9206 Los Sa… 7468
3 9 La Araucanía 92 Malleco 9207 Lumaco 9916
4 9 La Araucanía 92 Malleco 9208 Purén 12103
5 9 La Araucanía 92 Malleco 9209 Renaico 11002
6 9 La Araucanía 92 Malleco 9210 Traigu… 19260
7 9 La Araucanía 92 Malleco 9211 Victor… 35554
8 10 Los Lagos 101 Llanquihue 10101 Puerto… 280955
9 10 Los Lagos 101 Llanquihue 10102 Calbuco 37626
10 10 Los Lagos 101 Llanquihue 10103 Cochamó 3947
# ℹ 11 more rows
También puede servir para seleccionar la fila que tenga el mayor o menos valor en una columna:
censo |>
slice_max(población)
# A tibble: 1 × 7
cut_region region cut_provincia provincia cut_comuna comuna población
<dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl>
1 13 Metropolitana … 132 Cordille… 13201 Puent… 667904
censo |>
slice_min(población)
# A tibble: 1 × 7
cut_region region cut_provincia provincia cut_comuna comuna población
<dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl>
1 12 Magallanes y d… 122 Antártic… 12202 Antár… 151
Incluso nos puede servir para seleccionar una cantidad de filas elegidas al azar:
censo |>
slice_sample(n = 5) |>
select(comuna)
# A tibble: 5 × 1
comuna
<chr>
1 Quellón
2 Los Sauces
3 Arauco
4 Requínoa
5 Angol
Selección de filas por grupos
Haciendo uso de la función group_by()
podemos realizar operaciones en base a grupos. Esto significa que si agrupamos por región, y luego usamos slice_max()
para obtener las observaciones con mayor población, el filtro de slice_max()
se realizará una vez por cada región. Entonces, en vez de solamente obtener la comuna de mayor población del país, obtendremos la comuna con mayor población para cada región.
censo |>
group_by(region) |>
slice_max(población) |>
select(region, comuna, población)
# A tibble: 16 × 3
# Groups: region [16]
region comuna población
<chr> <chr> <dbl>
1 Antofagasta Antofagasta 444276
2 Arica y Parinacota Arica 257163
3 Atacama Copiapó 176100
4 Aysén del General Carlos Ibáñez del Campo Coyhaique 62046
5 Biobío Concepción 239776
6 Coquimbo Coquimbo 275644
7 La Araucanía Temuco 309696
8 Libertador General Bernardo O'Higgins Rancagua 274407
9 Los Lagos Puerto Montt 280955
10 Los Ríos Valdivia 182086
11 Magallanes y de la Antártica Chilena Punta Arenas 145713
12 Maule Talca 242344
13 Metropolitana de Santiago Puente Alto 667904
14 Tarapacá Iquique 231962
15 Valparaíso Viña del Mar 371490
16 Ñuble Chillán 204091
Con esto concluye este tutorial inicial para manipular datos con el paquete {dplyr}
. En siguientes tutoriales iremos usando funciones más complejas y avanzadas! 🫣
Si este tutorial te sirvió, por favor considera hacerme una donación! Cualquier monto me ayuda al menos a poder tomarme un cafecito 🥺