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.
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"),
nota2 = c(60,70,71,82,92,80,95,72),
carrera = c("Ecn","Ing","Ecn","Ing","Ecn","Ing","Ecn","Ing")
)
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
dplyr::filter(prov %in% c("Bani","Ocoa")) |>
summarise(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.
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.
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.
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.
dplyr::select(everything()) |>
dplyr::filter(nota > 69) |>
group_by(carrera) |>
summarise(mean(nota))
carrera `mean(nota)`
<chr> <dbl>
1 Ecn 86
2 Ing 76
Podemos agregar múltiples capas en group_by:
dplyr::select(everything()) |>
dplyr::filter(nota > 69) |>
group_by(carrera, prov) |>
summarise(promedio = mean(nota))
# 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:
dplyr::select(id,prov,starts_with("nota"))
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.
dplyr::select(id,starts_with("nota")) |>
pivot_longer(cols = !id, names_to='asigna', values_to='valor')
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.
dplyr::select(id,starts_with("nota")) |>
pivot_longer(cols = !id, names_to='asigna', values_to='valor') |>
arrange(desc(asigna))
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
dplyr::select(-starts_with("nota"))
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