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:
## 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:
## 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:
## # 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()
:
## # 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: