5.3 Operaciones con casos (filas)
Podemos seleccionar casos con filter()
:
%>% filter(sexo == "Mujer", minoria == "Sí") %>% head() emplea2
## 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()
:
%>% arrange(salario) %>% head() emplea2
## 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
%>% arrange(desc(salini), salario) %>% head() emplea2
## 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()
:
%>% summarise(sal.med = mean(salario), n = n()) empleados
## sal.med n
## 1 34419.57 474
Para realizar operaciones con múltiples variables podemos emplear across()
(admite selección de variables tidyselect
):
%>% summarise(across(where(is.numeric), mean), n = n()) empleados
## 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()
:
%>% group_by(sexo, minoria) %>%
empleados 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
%>% group_by(sexo, minoria) %>%
empleados 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.