4.5 Summarise

Con summarise() podemos agrupar diversos valores y aplicar una función para obtener un resumen que condense los valores. Para eso, agrupamos dada una variable. Por ejemplo, para obtener las poblaciones totales por estado

poblacion %>% 
  dplyr::group_by(nom_ent) %>%
  dplyr::summarise(pobtot = sum(pobtot))
## # A tibble: 32 × 2
##    nom_ent              pobtot
##    <chr>                 <dbl>
##  1 Aguascalientes      1425607
##  2 Baja California     3769020
##  3 Baja California Sur  798447
##  4 Campeche             928363
##  5 Chiapas             5543828
##  6 Chihuahua           3741869
##  7 Ciudad de México    9209944
##  8 Coahuila            3146771
##  9 Colima               731391
## 10 Durango             1832650
## # … with 22 more rows

Y para aplicar la misma función a diferentes variables o columnas sin repetir mucho código, se puede utilizar la función across().

poblacion %>% 
  dplyr::group_by(nom_ent) %>%
  dplyr::summarise(dplyr::across(c(pobtot, pobfem, pob0_14, pob15_64, pob65_mas), mean)) %>%
  head(3)
## # A tibble: 3 × 6
##   nom_ent              pobtot  pobfem pob0_14 pob15_64 pob65_mas
##   <chr>                 <dbl>   <dbl>   <dbl>    <dbl>     <dbl>
## 1 Aguascalientes      129601.  66266.  35018.   85621.     8825.
## 2 Baja California     628170  311405. 146384.  439536.    40880 
## 3 Baja California Sur 159689.  78514.  39411.  109808.     9703.

A across() le podemos especificar las columnas a resumir o también podemos seleccionarlas de acuerdo a su nombre o a su tipo de datos, usando selectores de tidyselect.

poblacion %>% 
  dplyr::group_by(nom_ent) %>%
  dplyr::summarise(dplyr::across(starts_with("pob"), mean)) %>%
  head(3)
## # A tibble: 3 × 6
##   nom_ent              pobtot  pobfem pob0_14 pob15_64 pob65_mas
##   <chr>                 <dbl>   <dbl>   <dbl>    <dbl>     <dbl>
## 1 Aguascalientes      129601.  66266.  35018.   85621.     8825.
## 2 Baja California     628170  311405. 146384.  439536.    40880 
## 3 Baja California Sur 159689.  78514.  39411.  109808.     9703.
poblacion %>% 
  dplyr::group_by(nom_ent) %>%
  dplyr::summarise(dplyr::across(where(is.double), mean)) %>%
  head(3)
## # A tibble: 3 × 6
##   nom_ent              pobtot  pobfem pob0_14 pob15_64 pob65_mas
##   <chr>                 <dbl>   <dbl>   <dbl>    <dbl>     <dbl>
## 1 Aguascalientes      129601.  66266.  35018.   85621.     8825.
## 2 Baja California     628170  311405. 146384.  439536.    40880 
## 3 Baja California Sur 159689.  78514.  39411.  109808.     9703.

El resultado es el mismo, pero seleccionamos las columnas deseadas de diferente forma, lo cual puede ser útil si tenemos dataframes muy grandes.

Existen un par de funciones en dplyr que nos permiten hacer un agregado rápido y sencillo en nuestros datos. Con count() podemos contar los valores únicos de una o más variables y tally() logra lo mismo, pero nosotros tenemos que especificar el agrupamiento. Por ejemplo, en el dataset de población, contando las apariciones de cada estado, estaríamos contando el número de municipios de cada estado que aparecen en el censo del INEGI.

poblacion %>%
  count(nom_ent, sort = TRUE)
## # A tibble: 32 × 2
##    nom_ent       n
##    <chr>     <int>
##  1 Oaxaca      570
##  2 Puebla      217
##  3 Veracruz    212
##  4 Jalisco     125
##  5 México      125
##  6 Chiapas     124
##  7 Michoacán   113
##  8 Yucatán     106
##  9 Hidalgo      84
## 10 Guerrero     81
## # … with 22 more rows
poblacion %>%
  group_by(nom_ent) %>%
  tally(sort = TRUE)
## # A tibble: 32 × 2
##    nom_ent       n
##    <chr>     <int>
##  1 Oaxaca      570
##  2 Puebla      217
##  3 Veracruz    212
##  4 Jalisco     125
##  5 México      125
##  6 Chiapas     124
##  7 Michoacán   113
##  8 Yucatán     106
##  9 Hidalgo      84
## 10 Guerrero     81
## # … with 22 more rows

Ambos resultados son iguales y al usar la opción sort=TRUE, los resultados aparecen ordenados de forma descendente. Estas funciones utilizan hacen uso de la función n() para contar los valores únicos y también podemos utilizarla, en conjunto con otras funciones en nuestro resumen.

poblacion %>%
  group_by(nom_ent) %>%
  summarise(pobtot = sum(pobtot), 
            municipios = n()) %>% 
  arrange(desc(municipios))
## # A tibble: 32 × 3
##    nom_ent     pobtot municipios
##    <chr>        <dbl>      <int>
##  1 Oaxaca     4132148        570
##  2 Puebla     6583278        217
##  3 Veracruz   8062579        212
##  4 Jalisco    8348151        125
##  5 México    16992418        125
##  6 Chiapas    5543828        124
##  7 Michoacán  4748846        113
##  8 Yucatán    2320898        106
##  9 Hidalgo    3082841         84
## 10 Guerrero   3540685         81
## # … with 22 more rows

Las funciones slice_max() y slice_min() nos permiten seleccionar las filas con valores máximos y mínimos dado una variable con el argumento order_by
y según el agrupamiento que hayamos elegido. Por ejemplo, para obtener los municipios con mayor población total

poblacion %>%
  group_by(nom_ent) %>%
  slice_max(order_by = pobtot)
## # A tibble: 32 × 9
## # Groups:   nom_ent [32]
##    entidad nom_ent           mun   nom_mun pobtot pobfem pob0_14 pob15…¹ pob65…²
##    <chr>   <chr>             <chr> <chr>    <dbl>  <dbl>   <dbl>   <dbl>   <dbl>
##  1 01      Aguascalientes    001   Aguasc… 9.49e5 486917  240583  639532   67941
##  2 02      Baja California   004   Tijuana 1.92e6 953783  449147 1359876  107406
##  3 03      Baja California … 008   Los Ca… 3.51e5 170167   93513  242624   12209
##  4 04      Campeche          002   Campec… 2.94e5 152522   67071  201182   25297
##  5 07      Chiapas           101   Tuxtla… 6.04e5 316623  145953  413489   42523
##  6 08      Chihuahua         037   Juárez  1.51e6 755473  380302 1042232   85438
##  7 09      Ciudad de México  007   Iztapa… 1.84e6 947835  366835 1293944  174312
##  8 05      Coahuila          030   Saltil… 8.80e5 442166  229165  590090   57919
##  9 06      Colima            007   Manzan… 1.91e5  95914   46527  131002   12994
## 10 10      Durango           005   Durango 6.89e5 353285  181469  454946   50310
## # … with 22 more rows, and abbreviated variable names ¹​pob15_64, ²​pob65_mas

O para obtener los dos municipios con menos población en cada estado

poblacion %>%
  group_by(nom_ent) %>%
  slice_min(order_by = pobtot, n = 2)
## # A tibble: 64 × 9
## # Groups:   nom_ent [32]
##    entidad nom_ent           mun   nom_mun pobtot pobfem pob0_14 pob15…¹ pob65…²
##    <chr>   <chr>             <chr> <chr>    <dbl>  <dbl>   <dbl>   <dbl>   <dbl>
##  1 01      Aguascalientes    008   San Jo…   9552   5020    3033    5838     681
##  2 01      Aguascalientes    004   Cosío    17000   8708    5183   10699    1118
##  3 02      Baja California   003   Tecate  108440  51310   25657   74969    7576
##  4 02      Baja California   006   San Qu… 117568  57790   36132   76391    4961
##  5 03      Baja California … 009   Loreto   18052   8795    4532   12212    1286
##  6 03      Baja California … 002   Mulegé   64022  30951   16999   42453    4460
##  7 04      Campeche          007   Paliza…   8683   4260    2442    5379     862
##  8 04      Campeche          008   Tenabo   11452   5655    3120    7406     926
##  9 07      Chiapas           088   Sunuapa   2308   1133     754    1382     172
## 10 07      Chiapas           063   Osumac…   3983   2004    1241    2474     263
## # … with 54 more rows, and abbreviated variable names ¹​pob15_64, ²​pob65_mas