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.