02C - Manejo de datos (extras)

Si quieres correr este script localmente, debe haber descargado el proyecto, como se explica en el script 2A.

Como al principio de todo script, recomiendo reiniciar R. Esto lo conseguimos con Session > Restart R y clickeando en la escoba del panel de “Environment” (superior derecho).

Ahora carguemos los paquetes que usaremos:

library(tidyverse)
library(readxl)  # leer datos de Excel
# install.packages(c("janitor", "writexl"))
library(janitor) # limpiar bases
library(writexl)  # guardar bases de Excel

Cargar y guardar bases de datos

Cargar desde múltiples formatos

Hay múltiples formatos en los podemos encontrar bases de datos tabulares. Por suerte, la consistencia del tidyverse nos permite usar funciones muy similares para trabajar con ellas en R (Araya y Cruz, 2019).

Extensión Descripción Función
.csv Archivo delimitado por comas read_csv()
.dta Stata (suele incluir etiquetas) haven::read_stata()
.Rdata R (puede tener múltiples objetos) load()
.rds R (un solo objeto) read_rds()
.sav SPSS (suele incluir etiquetas) haven::read_spss()
.xlsx Excel 2007- writexl::read_excel()

Limpiar nombres de columnas

En esta ocasión cargaremos unos datos en formato Excel. Es muy común encontrar datos que tienen este tipo de extensión, y en general no vienen demasiado limpios (el trabajo con planillas no necesariamente se hace pensando en el procesamiento con código).

Inspeccionémoslos visualmente. Son datos de casos policiales en 2016 para 340 comunas de Chile, recolectados desde la Subsecretaría de Prevención del Delito (2017).

Habiendo cargando el paquete readxl antes, la sintaxis para cargar los datos será familiar:

df_casos_policiales <- read_excel("datos/casos_delitos_por_comuna.xlsx")
glimpse(df_casos_policiales)
## Rows: 340
## Columns: 17
## $ Comuna                                       <chr> "Algarrobo", "Alhué", "Alto-Biobío", "Alto-del-Carmen", "Alto-Hospicio", "Ancud", "Andacollo", "Angol", "Antártica", "Antofagasta", "Antuco", "Arauco", "Arica", "Aysén", "Buin", "Bulnes", "Cab...
## $ `Comuna ID`                                  <dbl> 5602, 13502, 8314, 3302, 1107, 10202, 4103, 9201, 12202, 2101, 8302, 8202, 15101, 11201, 13402, 8402, 5402, 12201, 8303, 2201, 10102, 3102, 13403, 5302, 15102, 1402, 4202, 8203, 9102, 5603, 51...
## $ `Región ID`                                  <dbl> 5, 13, 8, 3, 1, 10, 4, 9, 12, 2, 8, 8, 15, 11, 13, 16, 5, 12, 8, 2, 10, 3, 13, 5, 15, 1, 4, 8, 9, 5, 5, 10, 5, 7, 13, 13, 10, 3, 6, 8, 11, 16, 16, 6, 9, 10, 11, 16, 10, 11, 6, 16, 16, 6, 7, 1,...
## $ `Población (INE 2017)`                       <dbl> 10700, 5916, 5957, 6519, 124872, 44249, 11555, 55845, 202, 389812, 3906, 38431, 243701, 28283, 86079, 22042, 20135, 2906, 29563, 181897, 35282, 18101, 25528, 15021, 783, 1277, 9911, 34277, 264...
## $ `Robos con violencia o intimidación`         <dbl> 23, 5, 1, 1, 396, 23, 11, 93, 0, 1150, 3, 40, 618, 18, 213, 17, 13, 0, 29, 652, 11, 67, 79, 16, 0, 0, 6, 53, 15, 121, 40, 57, 19, 34, 601, 587, 0, 29, 3, 204, 0, 30, 353, 30, 3, 8, 0, 1, 1, 0,...
## $ `Robos por sorpresa`                         <dbl> 11, 2, 1, 0, 222, 13, 6, 119, 0, 646, 0, 32, 451, 1, 154, 8, 10, 0, 4, 458, 4, 21, 15, 5, 0, 0, 0, 87, 10, 35, 19, 62, 13, 19, 227, 181, 0, 1, 2, 101, 0, 20, 426, 18, 1, 4, 0, 0, 0, 0, 1, 2, 4...
## $ `Robos de vehículo motorizado`               <dbl> 9, 2, 0, 0, 461, 2, 0, 41, 0, 987, 1, 5, 578, 0, 97, 10, 2, 0, 10, 686, 4, 23, 31, 6, 0, 0, 0, 18, 13, 34, 25, 9, 2, 13, 240, 144, 0, 5, 1, 61, 0, 14, 198, 5, 4, 0, 0, 0, 0, 0, 9, 4, 10, 4, 1,...
## $ `Robos de objeto de o desde vehículo`        <dbl> 56, 1, 3, 1, 338, 30, 8, 58, 0, 1010, 3, 24, 546, 11, 195, 22, 20, 0, 30, 840, 9, 24, 68, 18, 1, 0, 15, 32, 11, 105, 73, 79, 5, 10, 530, 93, 1, 14, 2, 116, 0, 45, 441, 34, 2, 3, 0, 2, 1, 1, 12...
## $ `Robos en lugar habitado`                    <dbl> 384, 18, 1, 6, 565, 111, 37, 261, 0, 1024, 3, 161, 524, 41, 399, 60, 51, 0, 102, 965, 44, 124, 119, 48, 5, 1, 28, 144, 35, 392, 132, 157, 30, 93, 206, 278, 1, 97, 7, 263, 4, 112, 737, 89, 19, ...
## $ `Robos en lugar no habitado`                 <dbl> 80, 16, 7, 7, 193, 130, 20, 181, 0, 778, 6, 159, 382, 44, 271, 45, 42, 4, 106, 577, 62, 125, 79, 34, 3, 1, 16, 105, 34, 88, 108, 136, 40, 74, 295, 191, 6, 83, 19, 109, 17, 92, 505, 90, 12, 31,...
## $ `Otros robos con fuerza`                     <dbl> 5, 1, 0, 0, 23, 6, 3, 35, 0, 43, 1, 4, 105, 5, 17, 4, 1, 0, 28, 40, 3, 14, 6, 0, 0, 1, 17, 5, 0, 10, 4, 6, 0, 11, 39, 7, 0, 6, 0, 3, 0, 7, 80, 4, 2, 1, 0, 0, 0, 0, 3, 6, 6, 1, 2, 2, 23, 25, 0,...
## $ Hurtos                                       <dbl> 184, 15, 18, 11, 791, 253, 39, 549, 0, 5445, 10, 312, 1735, 230, 513, 106, 48, 3, 170, 2156, 121, 206, 93, 57, 7, 1, 12, 252, 121, 236, 234, 702, 58, 243, 1201, 335, 17, 134, 49, 391, 38, 102,...
## $ `Lesiones menos graves, graves o gravísimas` <dbl> 22, 3, 16, 2, 130, 31, 9, 55, 0, 295, 1, 30, 343, 37, 63, 17, 19, 1, 29, 231, 37, 32, 28, 8, 1, 1, 3, 44, 20, 40, 34, 46, 24, 32, 78, 159, 3, 22, 6, 65, 5, 18, 156, 24, 8, 11, 7, 5, 2, 9, 17, ...
## $ `Lesiones leves`                             <dbl> 52, 26, 24, 8, 523, 132, 77, 244, 0, 1528, 8, 106, 720, 143, 257, 66, 55, 5, 81, 1047, 114, 136, 66, 29, 6, 7, 18, 145, 64, 161, 127, 176, 43, 96, 358, 307, 10, 70, 37, 239, 28, 58, 453, 78, 4...
## $ Homicidios                                   <dbl> 0, 1, 0, 0, 1, 0, 0, 2, 0, 13, 0, 1, 6, 0, 3, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0, 0, 0, 2, 0, 8, 0, 1, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 1, 0, 1, 2, 0, 0, 0, 10, 2, 0, 0, 11, 5, 0, ...
## $ Violaciones                                  <dbl> 1, 0, 3, 0, 20, 10, 1, 7, 0, 50, 0, 8, 47, 2, 12, 0, 1, 0, 3, 28, 13, 3, 3, 0, 2, 0, 1, 7, 4, 9, 7, 13, 1, 7, 6, 21, 1, 1, 0, 7, 0, 5, 32, 0, 0, 2, 0, 1, 0, 0, 4, 3, 0, 2, 3, 0, 26, 6, 3, 0, 6...
## $ VIF                                          <dbl> 129, 29, 62, 26, 1226, 330, 67, 508, 0, 2384, 34, 264, 1973, 314, 547, 177, 143, 13, 180, 1146, 369, 153, 120, 67, 3, 4, 31, 224, 123, 230, 219, 378, 119, 263, 521, 831, 22, 126, 77, 628, 19, ...

Los nombres de las columnas en la base tienen mayúsculas, espacios y tildes, lo que nos puede generar problemas en el análisis. La convención en el tidyverse es nombrar utilizando snake_case (nombre_de_mi_objeto), sin mayúsculas, espacios ni tildes. Esto nos ahorrará muchos problemas.

Si ya tenemos una base de datos y queremos estandarizar sus variables, el paquete janitor provee la función clean_names() para esto:

df_casos_policiales_l <- df_casos_policiales %>% 
  clean_names()
glimpse(df_casos_policiales_l)
## Rows: 340
## Columns: 17
## $ comuna                                    <chr> "Algarrobo", "Alhué", "Alto-Biobío", "Alto-del-Carmen", "Alto-Hospicio", "Ancud", "Andacollo", "Angol", "Antártica", "Antofagasta", "Antuco", "Arauco", "Arica", "Aysén", "Buin", "Bulnes", "Cabild...
## $ comuna_id                                 <dbl> 5602, 13502, 8314, 3302, 1107, 10202, 4103, 9201, 12202, 2101, 8302, 8202, 15101, 11201, 13402, 8402, 5402, 12201, 8303, 2201, 10102, 3102, 13403, 5302, 15102, 1402, 4202, 8203, 9102, 5603, 5102,...
## $ region_id                                 <dbl> 5, 13, 8, 3, 1, 10, 4, 9, 12, 2, 8, 8, 15, 11, 13, 16, 5, 12, 8, 2, 10, 3, 13, 5, 15, 1, 4, 8, 9, 5, 5, 10, 5, 7, 13, 13, 10, 3, 6, 8, 11, 16, 16, 6, 9, 10, 11, 16, 10, 11, 6, 16, 16, 6, 7, 1, 13...
## $ poblacion_ine_2017                        <dbl> 10700, 5916, 5957, 6519, 124872, 44249, 11555, 55845, 202, 389812, 3906, 38431, 243701, 28283, 86079, 22042, 20135, 2906, 29563, 181897, 35282, 18101, 25528, 15021, 783, 1277, 9911, 34277, 26467,...
## $ robos_con_violencia_o_intimidacion        <dbl> 23, 5, 1, 1, 396, 23, 11, 93, 0, 1150, 3, 40, 618, 18, 213, 17, 13, 0, 29, 652, 11, 67, 79, 16, 0, 0, 6, 53, 15, 121, 40, 57, 19, 34, 601, 587, 0, 29, 3, 204, 0, 30, 353, 30, 3, 8, 0, 1, 1, 0, 18...
## $ robos_por_sorpresa                        <dbl> 11, 2, 1, 0, 222, 13, 6, 119, 0, 646, 0, 32, 451, 1, 154, 8, 10, 0, 4, 458, 4, 21, 15, 5, 0, 0, 0, 87, 10, 35, 19, 62, 13, 19, 227, 181, 0, 1, 2, 101, 0, 20, 426, 18, 1, 4, 0, 0, 0, 0, 1, 2, 4, 0...
## $ robos_de_vehiculo_motorizado              <dbl> 9, 2, 0, 0, 461, 2, 0, 41, 0, 987, 1, 5, 578, 0, 97, 10, 2, 0, 10, 686, 4, 23, 31, 6, 0, 0, 0, 18, 13, 34, 25, 9, 2, 13, 240, 144, 0, 5, 1, 61, 0, 14, 198, 5, 4, 0, 0, 0, 0, 0, 9, 4, 10, 4, 1, 4,...
## $ robos_de_objeto_de_o_desde_vehiculo       <dbl> 56, 1, 3, 1, 338, 30, 8, 58, 0, 1010, 3, 24, 546, 11, 195, 22, 20, 0, 30, 840, 9, 24, 68, 18, 1, 0, 15, 32, 11, 105, 73, 79, 5, 10, 530, 93, 1, 14, 2, 116, 0, 45, 441, 34, 2, 3, 0, 2, 1, 1, 12, 1...
## $ robos_en_lugar_habitado                   <dbl> 384, 18, 1, 6, 565, 111, 37, 261, 0, 1024, 3, 161, 524, 41, 399, 60, 51, 0, 102, 965, 44, 124, 119, 48, 5, 1, 28, 144, 35, 392, 132, 157, 30, 93, 206, 278, 1, 97, 7, 263, 4, 112, 737, 89, 19, 25,...
## $ robos_en_lugar_no_habitado                <dbl> 80, 16, 7, 7, 193, 130, 20, 181, 0, 778, 6, 159, 382, 44, 271, 45, 42, 4, 106, 577, 62, 125, 79, 34, 3, 1, 16, 105, 34, 88, 108, 136, 40, 74, 295, 191, 6, 83, 19, 109, 17, 92, 505, 90, 12, 31, 15...
## $ otros_robos_con_fuerza                    <dbl> 5, 1, 0, 0, 23, 6, 3, 35, 0, 43, 1, 4, 105, 5, 17, 4, 1, 0, 28, 40, 3, 14, 6, 0, 0, 1, 17, 5, 0, 10, 4, 6, 0, 11, 39, 7, 0, 6, 0, 3, 0, 7, 80, 4, 2, 1, 0, 0, 0, 0, 3, 6, 6, 1, 2, 2, 23, 25, 0, 0,...
## $ hurtos                                    <dbl> 184, 15, 18, 11, 791, 253, 39, 549, 0, 5445, 10, 312, 1735, 230, 513, 106, 48, 3, 170, 2156, 121, 206, 93, 57, 7, 1, 12, 252, 121, 236, 234, 702, 58, 243, 1201, 335, 17, 134, 49, 391, 38, 102, 23...
## $ lesiones_menos_graves_graves_o_gravisimas <dbl> 22, 3, 16, 2, 130, 31, 9, 55, 0, 295, 1, 30, 343, 37, 63, 17, 19, 1, 29, 231, 37, 32, 28, 8, 1, 1, 3, 44, 20, 40, 34, 46, 24, 32, 78, 159, 3, 22, 6, 65, 5, 18, 156, 24, 8, 11, 7, 5, 2, 9, 17, 14,...
## $ lesiones_leves                            <dbl> 52, 26, 24, 8, 523, 132, 77, 244, 0, 1528, 8, 106, 720, 143, 257, 66, 55, 5, 81, 1047, 114, 136, 66, 29, 6, 7, 18, 145, 64, 161, 127, 176, 43, 96, 358, 307, 10, 70, 37, 239, 28, 58, 453, 78, 40, ...
## $ homicidios                                <dbl> 0, 1, 0, 0, 1, 0, 0, 2, 0, 13, 0, 1, 6, 0, 3, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0, 0, 0, 2, 0, 8, 0, 1, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 1, 0, 1, 2, 0, 0, 0, 10, 2, 0, 0, 11, 5, 0, 2, ...
## $ violaciones                               <dbl> 1, 0, 3, 0, 20, 10, 1, 7, 0, 50, 0, 8, 47, 2, 12, 0, 1, 0, 3, 28, 13, 3, 3, 0, 2, 0, 1, 7, 4, 9, 7, 13, 1, 7, 6, 21, 1, 1, 0, 7, 0, 5, 32, 0, 0, 2, 0, 1, 0, 0, 4, 3, 0, 2, 3, 0, 26, 6, 3, 0, 61, ...
## $ vif                                       <dbl> 129, 29, 62, 26, 1226, 330, 67, 508, 0, 2384, 34, 264, 1973, 314, 547, 177, 143, 13, 180, 1146, 369, 153, 120, 67, 3, 4, 31, 224, 123, 230, 219, 378, 119, 263, 521, 831, 22, 126, 77, 628, 19, 188...

(Ejercicios A-B)

A. ¿Cuál fue la comuna con más homicidios en Chile en el año 2016? Tu código:

B. ¿Cuál fue la comuna con más casos de violencia intrafamiliar por cada 1000 habitantes? Tu código:

Crear bases de datos “a mano”

A veces queremos crear un data frame arbitrariamente a partir de vectores. Para esto, la funcióm tibble() es simple y útil:

df_ejemplo <- tibble(
  x = c(1:10),
  y = c(9, 10, 1:8)
)
df_ejemplo
## # A tibble: 10 x 2
##        x     y
##    <int> <dbl>
##  1     1     9
##  2     2    10
##  3     3     1
##  4     4     2
##  5     5     3
##  6     6     4
##  7     7     5
##  8     8     6
##  9     9     7
## 10    10     8

Guardar bases de datos

Guardar una base de datos es necesario para compartirla con colegas o usarla en otros proyectos. La mayoría de las funciones que vimos, que comienzan con read_, tienen su versión write_ para este propósito. Por ejemplo, read_csv() -> write_csv(). El único par de comandos en los que hay algo distinto es readxl::read_excel() -> writexl::write_xlsx().

En general, los mejores formatos para guardar bases son .csv (muy universal) y .rds (nos aseguramos de que cualquier cosa extraña en nuestros datos pueda volver bien a R).

Guardemos los datos en formatos .csv, .rds y .xlsx (Excel). Recuerda que ya cargamos antes el paquete writexl, que nos permite hacer esto último.

write_csv(df_ejemplo, "df_ejemplo.csv")
write_csv(df_ejemplo, "df_ejemplo.rds")
write_xlsx(df_ejemplo, "df_ejemplo.xlsx")

Podríamos volver a cargarlo con read_excel():

df_ejemplo_comprob <- read_excel("df_ejemplo.xlsx")
df_ejemplo_comprob
## # A tibble: 10 x 2
##        x     y
##    <dbl> <dbl>
##  1     1     9
##  2     2    10
##  3     3     1
##  4     4     2
##  5     5     3
##  6     6     4
##  7     7     5
##  8     8     6
##  9     9     7
## 10    10     8

(Ejercicio)

Guarda una versión de la base de datos de delitos, en formato csv. Utiliza la versión con los nombres de columnas limpios y excluye la variable de región. Tu código:

Versiones iterativas de summarize() y mutate()

Es común necesitar hacer una misma operación en múltiples columnas de una base. Por ejemplo, podríamos querer los totales de delitos específicos por región, como muestra el siguiente chunk.

df_casos_policiales_l %>% 
  group_by(region_id) %>% 
  summarize(lesiones_leves_total = sum(lesiones_leves),
            hurtos_total = sum(hurtos))
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 16 x 3
##    region_id lesiones_leves_total hurtos_total
##        <dbl>                <dbl>        <dbl>
##  1         1                 1523         3935
##  2         2                 3014         8257
##  3         3                 1253         2953
##  4         4                 2830         6613
##  5         5                 6955        19537
##  6         6                 3347         8553
##  7         7                 2368         7371
##  8         8                 4549        13698
##  9         9                 3227         9808
## 10        10                 2824         9575
## 11        11                  486         1169
## 12        12                  525         1568
## 13        13                22796        65621
## 14        14                 1269         3783
## 15        15                  733         1762
## 16        16                 1250         3644

Sin embargo, hacer este código para los 13 tipos de delito es una pérdida de tiempo: generaría código particularmente difícil de leer. Podemos aplicar la función summarize_at() para usar la función de suma en múltiples variables. Noten cómo en el código siguiente “.” reemplazará a la variable en la definición de la operación (gracias al operador “~”).

df_casos_policiales_l %>% 
  group_by(region_id) %>% 
  summarize_at(.vars = vars(robos_con_violencia_o_intimidacion:vif),
               .funs = ~sum(.))
## # A tibble: 16 x 14
##    region_id robos_con_violencia_o_int~ robos_por_sorpresa robos_de_vehiculo_moto~ robos_de_objeto_de_o_des~ robos_en_lugar_hab~ robos_en_lugar_no_ha~ otros_robos_con_fu~ hurtos lesiones_menos_graves_grave~ lesiones_leves homicidios violaciones   vif
##        <dbl>                      <dbl>              <dbl>                   <dbl>                     <dbl>               <dbl>                 <dbl>               <dbl>  <dbl>                        <dbl>          <dbl>      <dbl>       <dbl> <dbl>
##  1         1                       1554               1499                    1339                      1773                1287                   822                 159   3935                          346           1523          9          51  3321
##  2         2                       1930               1173                    1754                      1999                2348                  1702                 143   8257                          599           3014         25          97  4192
##  3         3                        832                379                     355                       792                1299                  1346                 138   2953                          345           1253          7          40  2266
##  4         4                       1667               1106                     848                      2355                4000                  2450                 272   6613                          608           2830         13         116  4801
##  5         5                       5777               4537                    2994                      6062                9657                  5580                 402  19537                         1652           6955         44         263 11639
##  6         6                       1629               1011                     836                      1842                3842                  3246                 330   8553                          844           3347         15         116  6590
##  7         7                       1108                852                     411                      1050                2886                  2277                 311   7371                          621           2368         19          95  5342
##  8         8                       4646               2664                    2191                      3057                4972                  4283                 360  13698                         1342           4549         53         218  9362
##  9         9                       1547               1331                    1518                      1574                3902                  2609                 304   9808                          873           3227         27         194  7781
## 10        10                       1025                728                     399                      1683                2698                  2543                 151   9575                          761           2824         20         170  7253
## 11        11                         71                 26                      50                        60                 175                   210                  15   1169                          204            486          4          15  1085
## 12        12                        112                 29                     274                       162                 279                   262                  25   1568                          159            525          5          25   959
## 13        13                      41541              19168                   15364                     36183               19585                 18223                2811  65621                         5554          22796        215         976 41674
## 14        14                        424                339                     244                       711                1681                  1074                 137   3783                          337           1269         14          82  3148
## 15        15                        618                451                     579                       549                 532                   389                 105   1762                          346            733          6          50  1989
## 16        16                        605                513                     315                       701                1685                  1191                 158   3644                          383           1250         11          71  3315

Incluso podemos editar un poco los nombres de los resúmenes, asignándolos como elementos en una lista. Noten cómo van a cambiar dichos nombres, terminando ahora en "_total":

df_casos_policiales_l %>% 
  group_by(region_id) %>% 
  summarize_at(.vars = vars(robos_con_violencia_o_intimidacion:vif),
               .funs = list(total = ~sum(.)))
## # A tibble: 16 x 14
##    region_id robos_con_violencia_~ robos_por_sorpres~ robos_de_vehiculo_m~ robos_de_objeto_de_o~ robos_en_lugar_hab~ robos_en_lugar_no~ otros_robos_con_f~ hurtos_total lesiones_menos_grave~ lesiones_leves_~ homicidios_total violaciones_tot~ vif_total
##        <dbl>                 <dbl>              <dbl>                <dbl>                 <dbl>               <dbl>              <dbl>              <dbl>        <dbl>                 <dbl>            <dbl>            <dbl>            <dbl>     <dbl>
##  1         1                  1554               1499                 1339                  1773                1287                822                159         3935                   346             1523                9               51      3321
##  2         2                  1930               1173                 1754                  1999                2348               1702                143         8257                   599             3014               25               97      4192
##  3         3                   832                379                  355                   792                1299               1346                138         2953                   345             1253                7               40      2266
##  4         4                  1667               1106                  848                  2355                4000               2450                272         6613                   608             2830               13              116      4801
##  5         5                  5777               4537                 2994                  6062                9657               5580                402        19537                  1652             6955               44              263     11639
##  6         6                  1629               1011                  836                  1842                3842               3246                330         8553                   844             3347               15              116      6590
##  7         7                  1108                852                  411                  1050                2886               2277                311         7371                   621             2368               19               95      5342
##  8         8                  4646               2664                 2191                  3057                4972               4283                360        13698                  1342             4549               53              218      9362
##  9         9                  1547               1331                 1518                  1574                3902               2609                304         9808                   873             3227               27              194      7781
## 10        10                  1025                728                  399                  1683                2698               2543                151         9575                   761             2824               20              170      7253
## 11        11                    71                 26                   50                    60                 175                210                 15         1169                   204              486                4               15      1085
## 12        12                   112                 29                  274                   162                 279                262                 25         1568                   159              525                5               25       959
## 13        13                 41541              19168                15364                 36183               19585              18223               2811        65621                  5554            22796              215              976     41674
## 14        14                   424                339                  244                   711                1681               1074                137         3783                   337             1269               14               82      3148
## 15        15                   618                451                  579                   549                 532                389                105         1762                   346              733                6               50      1989
## 16        16                   605                513                  315                   701                1685               1191                158         3644                   383             1250               11               71      3315

También podemos utilizar más de una función de resumen a la vez en nuestros datos:

df_casos_policiales_l %>% 
  group_by(region_id) %>% 
  summarize_at(.vars = vars(robos_con_violencia_o_intimidacion:vif),
               .funs = list(total = ~sum(.), max = ~max(.)))
## # A tibble: 16 x 27
##    region_id robos_con_viole~ robos_por_sorpr~ robos_de_vehicu~ robos_de_objeto~ robos_en_lugar_~ robos_en_lugar_~ otros_robos_con~ hurtos_total lesiones_menos_~ lesiones_leves_~ homicidios_total violaciones_tot~ vif_total robos_con_viole~
##        <dbl>            <dbl>            <dbl>            <dbl>            <dbl>            <dbl>            <dbl>            <dbl>        <dbl>            <dbl>            <dbl>            <dbl>            <dbl>     <dbl>            <dbl>
##  1         1             1554             1499             1339             1773             1287              822              159         3935              346             1523                9               51      3321             1132
##  2         2             1930             1173             1754             1999             2348             1702              143         8257              599             3014               25               97      4192             1150
##  3         3              832              379              355              792             1299             1346              138         2953              345             1253                7               40      2266              615
##  4         4             1667             1106              848             2355             4000             2450              272         6613              608             2830               13              116      4801              723
##  5         5             5777             4537             2994             6062             9657             5580              402        19537             1652             6955               44              263     11639             1924
##  6         6             1629             1011              836             1842             3842             3246              330         8553              844             3347               15              116      6590              825
##  7         7             1108              852              411             1050             2886             2277              311         7371              621             2368               19               95      5342              627
##  8         8             4646             2664             2191             3057             4972             4283              360        13698             1342             4549               53              218      9362             1708
##  9         9             1547             1331             1518             1574             3902             2609              304         9808              873             3227               27              194      7781              876
## 10        10             1025              728              399             1683             2698             2543              151         9575              761             2824               20              170      7253              512
## 11        11               71               26               50               60              175              210               15         1169              204              486                4               15      1085               52
## 12        12              112               29              274              162              279              262               25         1568              159              525                5               25       959               99
## 13        13            41541            19168            15364            36183            19585            18223             2811        65621             5554            22796              215              976     41674             4302
## 14        14              424              339              244              711             1681             1074              137         3783              337             1269               14               82      3148              304
## 15        15              618              451              579              549              532              389              105         1762              346              733                6               50      1989              618
## 16        16              605              513              315              701             1685             1191              158         3644              383             1250               11               71      3315              353
## # ... with 12 more variables: robos_por_sorpresa_max <dbl>, robos_de_vehiculo_motorizado_max <dbl>, robos_de_objeto_de_o_desde_vehiculo_max <dbl>, robos_en_lugar_habitado_max <dbl>, robos_en_lugar_no_habitado_max <dbl>,
## #   otros_robos_con_fuerza_max <dbl>, hurtos_max <dbl>, lesiones_menos_graves_graves_o_gravisimas_max <dbl>, lesiones_leves_max <dbl>, homicidios_max <dbl>, violaciones_max <dbl>, vif_max <dbl>

Aparte de hacer resúmenes, crear múltiples variables según una misma operación es bastante común.

Supongamos que queremos las cifras relativas (tasas) para cada tipo de delito, como en el siguiente ejemplo:

df_casos_policiales_l %>% 
  mutate(lesiones_leves_c1000 = lesiones_leves * 1000 / poblacion_ine_2017) %>% 
  select(comuna, poblacion_ine_2017, lesiones_leves, lesiones_leves_c1000) # solo para legibilidad
## # A tibble: 340 x 4
##    comuna          poblacion_ine_2017 lesiones_leves lesiones_leves_c1000
##    <chr>                        <dbl>          <dbl>                <dbl>
##  1 Algarrobo                    10700             52                 4.86
##  2 Alhué                         5916             26                 4.39
##  3 Alto-Biobío                   5957             24                 4.03
##  4 Alto-del-Carmen               6519              8                 1.23
##  5 Alto-Hospicio               124872            523                 4.19
##  6 Ancud                        44249            132                 2.98
##  7 Andacollo                    11555             77                 6.66
##  8 Angol                        55845            244                 4.37
##  9 Antártica                      202              0                 0   
## 10 Antofagasta                 389812           1528                 3.92
## # ... with 330 more rows

Podemos utilizar mutate_at() para repetir esta operación en todas nuestras variables de interés.

df_casos_policiales_l %>% 
  mutate_at(.vars = vars(robos_con_violencia_o_intimidacion:vif),
            .funs = list(c1000 = ~ . * 1000 / poblacion_ine_2017))
## # A tibble: 340 x 30
##    comuna comuna_id region_id poblacion_ine_2~ robos_con_viole~ robos_por_sorpr~ robos_de_vehicu~ robos_de_objeto~ robos_en_lugar_~ robos_en_lugar_~ otros_robos_con~ hurtos lesiones_menos_~ lesiones_leves homicidios violaciones   vif robos_con_viole~
##    <chr>      <dbl>     <dbl>            <dbl>            <dbl>            <dbl>            <dbl>            <dbl>            <dbl>            <dbl>            <dbl>  <dbl>            <dbl>          <dbl>      <dbl>       <dbl> <dbl>            <dbl>
##  1 Algar~      5602         5            10700               23               11                9               56              384               80                5    184               22             52          0           1   129            2.15 
##  2 Alhué      13502        13             5916                5                2                2                1               18               16                1     15                3             26          1           0    29            0.845
##  3 Alto-~      8314         8             5957                1                1                0                3                1                7                0     18               16             24          0           3    62            0.168
##  4 Alto-~      3302         3             6519                1                0                0                1                6                7                0     11                2              8          0           0    26            0.153
##  5 Alto-~      1107         1           124872              396              222              461              338              565              193               23    791              130            523          1          20  1226            3.17 
##  6 Ancud      10202        10            44249               23               13                2               30              111              130                6    253               31            132          0          10   330            0.520
##  7 Andac~      4103         4            11555               11                6                0                8               37               20                3     39                9             77          0           1    67            0.952
##  8 Angol       9201         9            55845               93              119               41               58              261              181               35    549               55            244          2           7   508            1.67 
##  9 Antár~     12202        12              202                0                0                0                0                0                0                0      0                0              0          0           0     0            0    
## 10 Antof~      2101         2           389812             1150              646              987             1010             1024              778               43   5445              295           1528         13          50  2384            2.95 
## # ... with 330 more rows, and 12 more variables: robos_por_sorpresa_c1000 <dbl>, robos_de_vehiculo_motorizado_c1000 <dbl>, robos_de_objeto_de_o_desde_vehiculo_c1000 <dbl>, robos_en_lugar_habitado_c1000 <dbl>, robos_en_lugar_no_habitado_c1000 <dbl>,
## #   otros_robos_con_fuerza_c1000 <dbl>, hurtos_c1000 <dbl>, lesiones_menos_graves_graves_o_gravisimas_c1000 <dbl>, lesiones_leves_c1000 <dbl>, homicidios_c1000 <dbl>, violaciones_c1000 <dbl>, vif_c1000 <dbl>

(Ejercicio C)

Si queremos obtener un promedio por región en datos como estos, debemos calcular un promedio ponderado: si es que no hacemos esto, comunas con pocos habitantes estarán sobrerrepresentadas en los promedios. Un ejemplo a continuación:

df_casos_policiales_l %>% 
  group_by(region_id) %>% 
  summarize(prom_hurtos = weighted.mean(hurtos, w = poblacion_ine_2017))
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 16 x 2
##    region_id prom_hurtos
##        <dbl>       <dbl>
##  1         1       1968.
##  2         2       3941.
##  3         3       1216.
##  4         4       1543.
##  5         5       2039.
##  6         6       1139.
##  7         7       1305.
##  8         8       1304.
##  9         9       1608.
## 10        10       1826.
## 11        11        513.
## 12        12        990.
## 13        13       2329.
## 14        14       1064.
## 15        15       1711.
## 16        16        938.

Para cada tipo de delito, obtén el promedio ponderado por región. Tu código: