25 oct 2023

Una rápida introducción a la gestión de base de datos con dplyr en 10 minutos

Aquí proponemos una pequeña base de datos, para introducir el uso de dplyr como herramienta de gestión de base de datos en R.

data1 <- data.frame(
  id = 1:8,
  edad = c(8,9,12,22,14,17,22,16),
  mujer = c(T,T,F,F,F,T,T,F),
  prov = c("azua","azua","azua","Bani","Bani","Ocoa","Bani","Ocoa"),
  nota = c(60,70,71,82,92,80,95,72),
  nota2 = c(60,70,71,82,92,80,95,72),
  carrera = c("Ecn","Ing","Ecn","Ing","Ecn","Ing","Ecn","Ing")
)
 
data1
  id edad mujer prov nota nota2 carrera
1  1    8  TRUE azua   60    60     Ecn
2  2    9  TRUE azua   70    70     Ing
3  3   12 FALSE azua   71    71     Ecn
4  4   22 FALSE Bani   82    82     Ing
5  5   14 FALSE Bani   92    92     Ecn
6  6   17  TRUE Ocoa   80    80     Ing
7  7   22  TRUE Bani   95    95     Ecn
8  8   16 FALSE Ocoa   72    72     Ing

Con el siguiente ejemplo solo queremos ilustrar que dplyr es una alternativa a las operaciones tradicionales con R:

Nota promedio

Base de R

mean(nota[prov %in% c("Bani","Ocoa")])

[1] 84.2

Paquete dplyr

 Library(tidyverse)
 
data1 |>
  dplyr::filter(prov %in% c("Bani","Ocoa")) |>
  summarise(mean(nota))
   mean(nota)
1       84.2

1. Select. Permite seleccionar columnas o variables de una base de datos. De la base anterior, usamos select para seleccionar las columnas id y edad. Note que se usa dplyr::select, para especificar de que paquete deseamos usar la función select, dado que existen varios paquetes con funciones de este nombre.

data1 |>
  dplyr::select(id,edad)
  id edad
1  1    8
2  2    9
3  3   12
4  4   22
5  5   14
6  6   17
7  7   22
8  8   16

2. filter. Condicionar las observaciones deseadas. Es un filtro al permitir discriminar entre observaciones en función del cumplimiento de alguna condición de las mismas. En el ejemplo siguiente usamos select para elegir todas las variables (everything), y posteriormente filtramos para solo acceder a las personas con calificación mayor a 69.

 data1 |>
  dplyr::select(everything()) |>
  dplyr::filter(nota > 69)
  id edad mujer prov nota nota2 carrera
1  2    9  TRUE azua   70    70     Ing
2  3   12 FALSE azua   71    71     Ecn
3  4   22 FALSE Bani   82    82     Ing
4  5   14 FALSE Bani   92    92     Ecn
5  6   17  TRUE Ocoa   80    80     Ing
6  7   22  TRUE Bani   95    95     Ecn
7  8   16 FALSE Ocoa   72    72     Ing

3. mutate. Se crea para crear una variable o crear una variable nueva. En este sentido podemos usar los operadores de R para crear las variables que entendamos. Por ejemplo, ahora creamos la variable edad al 2.

 data1 |>
  dplyr::select(everything()) |>
  dplyr::filter(nota > 69) |>
  mutate(Edad2 = edad^2)
  id edad mujer prov nota nota2 carrera Edad2
1  2    9  TRUE azua   70    70     Ing    81
2  3   12 FALSE azua   71    71     Ecn   144
3  4   22 FALSE Bani   82    82     Ing   484
4  5   14 FALSE Bani   92    92     Ecn   196
5  6   17  TRUE Ocoa   80    80     Ing   289
6  7   22  TRUE Bani   95    95     Ecn   484
7  8   16 FALSE Ocoa   72    72     Ing   256

4. summarise. Permite crear un resumen de la base de datos, análisis condicional. Por ejemplo, sacamos las notas promedio por carrera. Note que ahora debemos indicar cual es la función de agregación de las variables.

data1 |>
  dplyr::select(everything()) |>
  dplyr::filter(nota > 69) |>
  group_by(carrera) |>
  summarise(mean(nota))
 
# A tibble: 2 x 2
  carrera `mean(nota)`
  <chr>          <dbl>
1 Ecn               86
2 Ing               76

Podemos agregar múltiples capas en group_by:

data1 |>
  dplyr::select(everything()) |>
  dplyr::filter(nota > 69) |>
  group_by(carrera, prov) |>
  summarise(promedio = mean(nota))
 
`summarise()` has grouped output by 'carrera'. You can override using the `.groups` argument.
# A tibble: 5 x 3
# Groups:   carrera [2]
  carrera prov  promedio
  <chr>   <chr>    <dbl>
1 Ecn     azua      71 
2 Ecn     Bani      93.5
3 Ing     azua      70 
4 Ing     Bani      82 
5 Ing     Ocoa      76

5. Cambiar la estructura de una base de datos. Por el formato wide:

data1 |>
  dplyr::select(id,prov,starts_with("nota"))
 
  id prov nota nota2
1  1 azua   60    60
2  2 azua   70    70
3  3 azua   71    71
4  4 Bani   82    82
5  5 Bani   92    92
6  6 Ocoa   80    80
7  7 Bani   95    95
8  8 Ocoa   72    72

Ahora, la base anterior la transformamos en formato long.

data1 |>
  dplyr::select(id,starts_with("nota")) |>
  pivot_longer(cols = !id, names_to='asigna', values_to='valor')
 
# A tibble: 16 x 3
      id asigna valor
   <int> <chr>  <dbl>
 1     1 nota      60
 2     1 nota2     60
 3     2 nota      70
 4     2 nota2     70
 5     3 nota      71
 6     3 nota2     71
 7     4 nota      82
 8     4 nota2     82
 9     5 nota      92
10     5 nota2     92
11     6 nota      80
12     6 nota2     80
13     7 nota      95
14     7 nota2     95
15     8 nota      72
16     8 nota2     72

6. Arrange. Organizar la base de datos. En este caso, organizamos la base de datos en función del valor de una o múltiples variable.

 data_long <- data1 |>
  dplyr::select(id,starts_with("nota")) |>
  pivot_longer(cols = !id, names_to='asigna', values_to='valor') |>
  arrange(desc(asigna))
 
data_long
 
# A tibble: 16 x 3
      id asigna valor
   <int> <chr>  <dbl>
 1     1 nota2     60
 2     2 nota2     70
 3     3 nota2     71
 4     4 nota2     82
 5     5 nota2     92
 6     6 nota2     80
 7     7 nota2     95
 8     8 nota2     72
 9     1 nota      60
10     2 nota      70
11     3 nota      71
12     4 nota      82
13     5 nota      92
14     6 nota      80
15     7 nota      95
16     8 nota      72

 7. inner. Permite combinar información de distintas bases relacionadas.

 inner_join(data_long, data1, by = "id")  |>
  dplyr::select(-starts_with("nota"))
 
# A tibble: 16 x 7
      id asigna valor  edad mujer prov  carrera
   <int> <chr>  <dbl> <dbl> <lgl> <chr> <chr> 
 1     1 nota2     60     8 TRUE  azua  Ecn   
 2     2 nota2     70     9 TRUE  azua  Ing   
 3     3 nota2     71    12 FALSE azua  Ecn   
 4     4 nota2     82    22 FALSE Bani  Ing   
 5     5 nota2     92    14 FALSE Bani  Ecn   
 6     6 nota2     80    17 TRUE  Ocoa  Ing   
 7     7 nota2     95    22 TRUE  Bani  Ecn   
 8     8 nota2     72    16 FALSE Ocoa  Ing   
 9     1 nota      60     8 TRUE  azua  Ecn   
10     2 nota      70     9 TRUE  azua  Ing   
11     3 nota      71    12 FALSE azua  Ecn   
12     4 nota      82    22 FALSE Bani  Ing   
13     5 nota      92    14 FALSE Bani  Ecn   
14     6 nota      80    17 TRUE  Ocoa  Ing   
15     7 nota      95    22 TRUE  Bani  Ecn   
16     8 nota      72    16 FALSE Ocoa  Ing

Creando variables por grupos en dplyr (group_by + mutate)

  Simulemos una base de hogares, donde se identifica el hogar, el sexo (1 mujer) y provincia y edad para cada miembro.   # Definir la lista ...