5.3 Operaciones con casos (filas)
Podemos seleccionar casos con filter():
emplea2 %>% filter(sexo == "Mujer", minoria == "Sí") %>% head()## id sexo minoria tiempemp salini salario
## 1 14 Mujer Sí 98 16800 35100
## 2 23 Mujer Sí 97 11100 24000
## 3 24 Mujer Sí 97 9000 16950
## 4 25 Mujer Sí 97 9000 21150
## 5 40 Mujer Sí 96 9000 19200
## 6 41 Mujer Sí 96 11550 23550
Podemos reordenar casos con arrange():
emplea2 %>% arrange(salario) %>% head()## id sexo minoria tiempemp salini salario
## 1 378 Mujer No 70 10200 15750
## 2 338 Mujer No 74 10200 15900
## 3 90 Mujer No 92 9750 16200
## 4 224 Mujer No 82 10200 16200
## 5 411 Mujer No 68 10200 16200
## 6 448 Mujer Sí 66 10200 16350
emplea2 %>% arrange(desc(salini), salario) %>% head()## id sexo minoria tiempemp salini salario
## 1 29 Hombre No 96 79980 135000
## 2 343 Hombre No 73 60000 103500
## 3 205 Hombre No 83 52500 66750
## 4 160 Hombre No 86 47490 66000
## 5 431 Hombre No 66 45000 86250
## 6 32 Hombre No 96 45000 110625
Podemos resumir valores con summarise():
empleados %>% summarise(sal.med = mean(salario), n = n())## sal.med n
## 1 34419.57 474
Para realizar operaciones con múltiples variables podemos emplear across() (admite selección de variables tidyselect):
empleados %>% summarise(across(where(is.numeric), mean), n = n())## id educ salario salini tiempemp expprev n
## 1 237.5 13.49156 34419.57 17016.09 81.1097 95.86076 474
# empleados %>% summarise(across(where(is.numeric) & !id, mean), n = n())NOTA: Esta función sustituye a las “variantes de ámbito” _at(), _if() y _all() de versiones anteriores de dplyr (como summarise_at(), summarise_if(), summarise_all(), mutate_at(), mutate_if()…) y también el uso de vars().
En el caso de filter() se puede emplear if_any() e if_all().
Podemos agrupar casos con group_by():
empleados %>% group_by(sexo, minoria) %>%
summarise(sal.med = mean(salario), n = n()) %>%
ungroup()## # A tibble: 4 x 4
## sexo minoria sal.med n
## <fct> <fct> <dbl> <int>
## 1 Hombre No 44475. 194
## 2 Hombre Sí 32246. 64
## 3 Mujer No 26707. 176
## 4 Mujer Sí 23062. 40
empleados %>% group_by(sexo, minoria) %>%
summarise(sal.med = mean(salario), n = n(), .groups = "drop")## # A tibble: 4 x 4
## sexo minoria sal.med n
## <fct> <fct> <dbl> <int>
## 1 Hombre No 44475. 194
## 2 Hombre Sí 32246. 64
## 3 Mujer No 26707. 176
## 4 Mujer Sí 23062. 40
# dplyr >= 1.1.0 # packageVersion("dplyr")
# empleados %>% summarise(sal.med = mean(salario), n = n(),
# .by = c(sexo, minoria))Por defecto la agrupación se mantiene para el resto de operaciones, habría que emplear ungroup() (o el argumento .groups = "drop") para eliminarla (se puede emplear group_vars() o str() para ver la agrupación).
Desde dplyr 1.1.0 (2023-01-29) está disponible un parámetro .by/by en mutate(), summarise(), filter() y slice() como alternativa a agrupar y desagrupar posteriormente.
Para más detalles ver Per-operation grouping with .by/by.