06B - Cadenas de texto
Como al principio de todo script, recomiendo reiniciar R. Esto lo conseguimos en RStudio Cloud con Session > Restart R y clickeando en la escoba del panel de “Environment” (superior derecho).
Inicio: cargar paquetes, base de datos
## Parsed with column specification:
## cols(
## nombre_comp = col_character(),
## id = col_double(),
## caja_trayectoria = col_character()
## )
Esta base de datos contiene información de las reseñas parlamentarias de la BCN, para legisladores con cargos entre 1990-presente (ejemplo). La unidad de análisis de esta base es legislador-cargo.
Cadenas de texto
Los elementos en un vector de caracteres se pueden denominar “strings” o cadenas de texto. Veamos los primeros elementos del vector “caja_trayectoria”:
## [1] "\nSenador institucional \n1998- 2006\n" "\nDiputado \n2010- 2014\nDistrito N° 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene"
## [3] "\nDiputado \n2006- 2010\nDistrito N° 24Partido por la Democracia" "\nDiputado \n2002- 2006\nDistrito N° 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier"
## [5] "\nDiputado \n1998- 2002\nDistrito N° 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada" "\nDiputado \n1994- 1998\nDistrito N° 52Partido Demócrata Cristiano"
Cada una de estas cadenas de texto contiene información que podría distribuirse en al menos cinco variables: cargo (diputado, senador*), año de inicio del período, año de término del período, distrito, partido. Nuestro objetivo será poder trabajar con dicha información, que por ahora está perdida en las cadenas (y es inútil). Para esto utilizaremos el paquete stringr
, que se carga con el tidyverse
.
Por cierto, los \n
que se leen en las cadenas de texto significan “salto de párrafo”, como podemos ver en la caja de la reseña parlamentaria de ejemplo.
Algunas operaciones simples con texto
Cambiar mayúsculas
df_legisladores_cargos %>%
mutate(caja_trayectoria_edit = str_to_lower(caja_trayectoria)) %>%
select(caja_trayectoria, caja_trayectoria_edit) # solo para ver mejor el resultado
## # A tibble: 1,191 x 2
## caja_trayectoria caja_trayectoria_edit
## <chr> <chr>
## 1 "\nSenador institucional \n1998- 2006\n" "\nsenador institucional \n1998- 2006\n"
## 2 "\nDiputado \n2010- 2014\nDistrito N° 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene" "\ndiputado \n2010- 2014\ndistrito n° 24partido por la democraciasucedido por: jaime hernán gonzalo pilowsky greene"
## 3 "\nDiputado \n2006- 2010\nDistrito N° 24Partido por la Democracia" "\ndiputado \n2006- 2010\ndistrito n° 24partido por la democracia"
## 4 "\nDiputado \n2002- 2006\nDistrito N° 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier" "\ndiputado \n2002- 2006\ndistrito n° 24partido por la democraciaprecedido por: tomás jocelyn holt letelier"
## 5 "\nDiputado \n1998- 2002\nDistrito N° 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada" "\ndiputado \n1998- 2002\ndistrito n° 52partido demócrata cristianosucedido por: fernando meza moncada"
## 6 "\nDiputado \n1994- 1998\nDistrito N° 52Partido Demócrata Cristiano" "\ndiputado \n1994- 1998\ndistrito n° 52partido demócrata cristiano"
## 7 "\nDiputado \n1990- 1994\nDistrito N° 52Partido Demócrata Cristiano" "\ndiputado \n1990- 1994\ndistrito n° 52partido demócrata cristiano"
## 8 "\nDiputado \n2006- 2010\nDistrito N° 5Partido Renovación NacionalPrecedido por: Carlos Vilches GuzmánSucedido por: Carlos~ "\ndiputado \n2006- 2010\ndistrito n° 5partido renovación nacionalprecedido por: carlos vilches guzmánsucedido por: carlos~
## 9 "\nDiputado \n2014- 2018\nDistrito N° 37 Independiente" "\ndiputado \n2014- 2018\ndistrito n° 37 independiente"
## 10 "\nDiputado \n2010- 2014\nDistrito N° 37 Izquierda Ciudadana" "\ndiputado \n2010- 2014\ndistrito n° 37 izquierda ciudadana"
## # ... with 1,181 more rows
(Ejercicio a)
Mira el archivo de ayuda de str_to_lower()
. ¿Qué otras operaciones podemos hacer con las mayúsculas? Pruébalas con el ejemplo anterior. Tu código:
Eliminar espacios innecesarios
df_legisladores_cargos %>%
mutate(caja_trayectoria_edit = str_squish(caja_trayectoria)) %>%
select(caja_trayectoria, caja_trayectoria_edit) # solo para ver mejor el resultado
## # A tibble: 1,191 x 2
## caja_trayectoria caja_trayectoria_edit
## <chr> <chr>
## 1 "\nSenador institucional \n1998- 2006\n" Senador institucional 1998- 2006
## 2 "\nDiputado \n2010- 2014\nDistrito N° 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene" Diputado 2010- 2014 Distrito N° 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene
## 3 "\nDiputado \n2006- 2010\nDistrito N° 24Partido por la Democracia" Diputado 2006- 2010 Distrito N° 24Partido por la Democracia
## 4 "\nDiputado \n2002- 2006\nDistrito N° 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier" Diputado 2002- 2006 Distrito N° 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier
## 5 "\nDiputado \n1998- 2002\nDistrito N° 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada" Diputado 1998- 2002 Distrito N° 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada
## 6 "\nDiputado \n1994- 1998\nDistrito N° 52Partido Demócrata Cristiano" Diputado 1994- 1998 Distrito N° 52Partido Demócrata Cristiano
## 7 "\nDiputado \n1990- 1994\nDistrito N° 52Partido Demócrata Cristiano" Diputado 1990- 1994 Distrito N° 52Partido Demócrata Cristiano
## 8 "\nDiputado \n2006- 2010\nDistrito N° 5Partido Renovación NacionalPrecedido por: Carlos Vilches GuzmánSucedido por: Carlos Vil~ Diputado 2006- 2010 Distrito N° 5Partido Renovación NacionalPrecedido por: Carlos Vilches GuzmánSucedido por: Carlos V~
## 9 "\nDiputado \n2014- 2018\nDistrito N° 37 Independiente" Diputado 2014- 2018 Distrito N° 37 Independiente
## 10 "\nDiputado \n2010- 2014\nDistrito N° 37 Izquierda Ciudadana" Diputado 2010- 2014 Distrito N° 37 Izquierda Ciudadana
## # ... with 1,181 more rows
Obtener número de caracteres
df_legisladores_cargos %>%
mutate(caja_trayectoria_edit = str_length(caja_trayectoria)) %>%
select(caja_trayectoria, caja_trayectoria_edit) # solo para ver mejor el resultado
## # A tibble: 1,191 x 2
## caja_trayectoria caja_trayectoria_edit
## <chr> <int>
## 1 "\nSenador institucional \n1998- 2006\n" 35
## 2 "\nDiputado \n2010- 2014\nDistrito N° 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene" 111
## 3 "\nDiputado \n2006- 2010\nDistrito N° 24Partido por la Democracia" 61
## 4 "\nDiputado \n2002- 2006\nDistrito N° 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier" 103
## 5 "\nDiputado \n1998- 2002\nDistrito N° 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada" 98
## 6 "\nDiputado \n1994- 1998\nDistrito N° 52Partido Demócrata Cristiano" 63
## 7 "\nDiputado \n1990- 1994\nDistrito N° 52Partido Demócrata Cristiano" 63
## 8 "\nDiputado \n2006- 2010\nDistrito N° 5Partido Renovación NacionalPrecedido por: Carlos Vilches GuzmánSucedido por: Carlos Vilches Guzmán" 133
## 9 "\nDiputado \n2014- 2018\nDistrito N° 37 Independiente" 50
## 10 "\nDiputado \n2010- 2014\nDistrito N° 37 Izquierda Ciudadana" 56
## # ... with 1,181 more rows
Funciones para trabajar con patrones
En general, podemos encontrar patrones en las cadenas que nos permitirán interpretar la información que contienen. Como los datos de texto suelen ser desestructurados, tendremos que idear estos patrones ad hoc, caso a caso.
El patrón más sencillo es simplemente una serie textual de caracteres. Por ejemplo, podemos ocupar la función lógica str_detect()
para marcar todas las observaciones que incluyen la serie de caracteres “Diputad” en la variable “caja_trayectoria”:
df_legisladores_cargos %>%
mutate(caja_trayectoria_edit = str_detect(caja_trayectoria,
pattern = "Diputad")) %>%
select(caja_trayectoria, caja_trayectoria_edit) # solo para ver mejor el resultado
## # A tibble: 1,191 x 2
## caja_trayectoria caja_trayectoria_edit
## <chr> <lgl>
## 1 "\nSenador institucional \n1998- 2006\n" FALSE
## 2 "\nDiputado \n2010- 2014\nDistrito N° 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene" TRUE
## 3 "\nDiputado \n2006- 2010\nDistrito N° 24Partido por la Democracia" TRUE
## 4 "\nDiputado \n2002- 2006\nDistrito N° 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier" TRUE
## 5 "\nDiputado \n1998- 2002\nDistrito N° 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada" TRUE
## 6 "\nDiputado \n1994- 1998\nDistrito N° 52Partido Demócrata Cristiano" TRUE
## 7 "\nDiputado \n1990- 1994\nDistrito N° 52Partido Demócrata Cristiano" TRUE
## 8 "\nDiputado \n2006- 2010\nDistrito N° 5Partido Renovación NacionalPrecedido por: Carlos Vilches GuzmánSucedido por: Carlos Vilches Guzmán" TRUE
## 9 "\nDiputado \n2014- 2018\nDistrito N° 37 Independiente" TRUE
## 10 "\nDiputado \n2010- 2014\nDistrito N° 37 Izquierda Ciudadana" TRUE
## # ... with 1,181 more rows
Como sabemos, las funciones lógicas nos permiten filtrar bases:
df_legisladores_cargos %>%
filter(str_detect(caja_trayectoria, pattern = "Diputad")) %>%
select(caja_trayectoria) # solo para ver mejor el resultado
## # A tibble: 985 x 1
## caja_trayectoria
## <chr>
## 1 "\nDiputado \n2010- 2014\nDistrito N° 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene"
## 2 "\nDiputado \n2006- 2010\nDistrito N° 24Partido por la Democracia"
## 3 "\nDiputado \n2002- 2006\nDistrito N° 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier"
## 4 "\nDiputado \n1998- 2002\nDistrito N° 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada"
## 5 "\nDiputado \n1994- 1998\nDistrito N° 52Partido Demócrata Cristiano"
## 6 "\nDiputado \n1990- 1994\nDistrito N° 52Partido Demócrata Cristiano"
## 7 "\nDiputado \n2006- 2010\nDistrito N° 5Partido Renovación NacionalPrecedido por: Carlos Vilches GuzmánSucedido por: Carlos Vilches Guzmán"
## 8 "\nDiputado \n2014- 2018\nDistrito N° 37 Independiente"
## 9 "\nDiputado \n2010- 2014\nDistrito N° 37 Izquierda Ciudadana"
## 10 "\nDiputado \n2006- 2010\nDistrito N° 37Partido Socialista de Chile"
## # ... with 975 more rows
También podemos ocupar una negación para obtener las observaciones de senadores:
df_legisladores_cargos %>%
filter(!str_detect(caja_trayectoria, pattern = "Diputad")) %>%
select(caja_trayectoria) # solo para ver mejor el resultado
## # A tibble: 206 x 1
## caja_trayectoria
## <chr>
## 1 "\nSenador institucional \n1998- 2006\n"
## 2 "\nSenador \n2014- 2022\n7ª Circunscripción (2018-2022)Partido Renovación Nacional"
## 3 "\nSenador \n2014- 2022\n8ª Circunscripción (2014-2018)Partido Renovación NacionalPrecedido por: Jovino Novoa Vásquez"
## 4 "\nSenador \n2006- 2014\nTérmino de periodo: 16 de enero de 201116ª CircunscripciónPartido Renovación NacionalPrecedido por: Marco Antonio Cariola BarroilhetSucedido por: Carlos Larraín Peña"
## 5 "\nSenadora \n2018- 2026\n6ª CircunscripciónPartido Socialista de Chile"
## 6 "\nSenadora \n2010- 2018\n3ª CircunscripciónPartido Socialista de ChilePrecedido por: Ricardo Núñez Muñoz"
## 7 "\nSenadora \n2006- 2014\n8ª Circunscripción Santiago OrientePartido Demócrata CristianoSucedido por: Carlos Montes Cisternas"
## 8 "\nSenador \n2002- 2010\n6ª Circunscripción CostaPartido Unión Demócrata IndependientePrecedido por: Beltrán Urenda ZegersSucedido por: Francisco Chahuán Chahuán"
## 9 "\nSenadora \n2018- 2026\n11ª Circunscripción Independiente"
## 10 "\nSenador \n2014- 2022\nCircunscripción N° 3 (2018-2022) Independiente"
## # ... with 196 more rows
Ahora introduciremos tres funciones que utilizan patrones, str_extract()
, str_replace()
y str_remove()
. ¿Qué hace cada una?
Tus notas:
df_legisladores_cargos %>%
mutate(caja_trayectoria_edit = str_extract(caja_trayectoria,
pattern = "Diputad")) %>%
select(caja_trayectoria, caja_trayectoria_edit) # solo para ver mejor el resultado
## # A tibble: 1,191 x 2
## caja_trayectoria caja_trayectoria_edit
## <chr> <chr>
## 1 "\nSenador institucional \n1998- 2006\n" <NA>
## 2 "\nDiputado \n2010- 2014\nDistrito N° 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene" Diputad
## 3 "\nDiputado \n2006- 2010\nDistrito N° 24Partido por la Democracia" Diputad
## 4 "\nDiputado \n2002- 2006\nDistrito N° 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier" Diputad
## 5 "\nDiputado \n1998- 2002\nDistrito N° 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada" Diputad
## 6 "\nDiputado \n1994- 1998\nDistrito N° 52Partido Demócrata Cristiano" Diputad
## 7 "\nDiputado \n1990- 1994\nDistrito N° 52Partido Demócrata Cristiano" Diputad
## 8 "\nDiputado \n2006- 2010\nDistrito N° 5Partido Renovación NacionalPrecedido por: Carlos Vilches GuzmánSucedido por: Carlos Vilches Guzmán" Diputad
## 9 "\nDiputado \n2014- 2018\nDistrito N° 37 Independiente" Diputad
## 10 "\nDiputado \n2010- 2014\nDistrito N° 37 Izquierda Ciudadana" Diputad
## # ... with 1,181 more rows
df_legisladores_cargos %>%
mutate(caja_trayectoria_edit = str_replace(caja_trayectoria,
pattern = "institucional",
replacement = "designado")) %>%
select(caja_trayectoria, caja_trayectoria_edit) # solo para ver mejor el resultado
## # A tibble: 1,191 x 2
## caja_trayectoria caja_trayectoria_edit
## <chr> <chr>
## 1 "\nSenador institucional \n1998- 2006\n" "\nSenador designado \n1998- 2006\n"
## 2 "\nDiputado \n2010- 2014\nDistrito N° 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene" "\nDiputado \n2010- 2014\nDistrito N° 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene"
## 3 "\nDiputado \n2006- 2010\nDistrito N° 24Partido por la Democracia" "\nDiputado \n2006- 2010\nDistrito N° 24Partido por la Democracia"
## 4 "\nDiputado \n2002- 2006\nDistrito N° 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier" "\nDiputado \n2002- 2006\nDistrito N° 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier"
## 5 "\nDiputado \n1998- 2002\nDistrito N° 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada" "\nDiputado \n1998- 2002\nDistrito N° 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada"
## 6 "\nDiputado \n1994- 1998\nDistrito N° 52Partido Demócrata Cristiano" "\nDiputado \n1994- 1998\nDistrito N° 52Partido Demócrata Cristiano"
## 7 "\nDiputado \n1990- 1994\nDistrito N° 52Partido Demócrata Cristiano" "\nDiputado \n1990- 1994\nDistrito N° 52Partido Demócrata Cristiano"
## 8 "\nDiputado \n2006- 2010\nDistrito N° 5Partido Renovación NacionalPrecedido por: Carlos Vilches GuzmánSucedido por: Carlos~ "\nDiputado \n2006- 2010\nDistrito N° 5Partido Renovación NacionalPrecedido por: Carlos Vilches GuzmánSucedido por: Carlos~
## 9 "\nDiputado \n2014- 2018\nDistrito N° 37 Independiente" "\nDiputado \n2014- 2018\nDistrito N° 37 Independiente"
## 10 "\nDiputado \n2010- 2014\nDistrito N° 37 Izquierda Ciudadana" "\nDiputado \n2010- 2014\nDistrito N° 37 Izquierda Ciudadana"
## # ... with 1,181 more rows
df_legisladores_cargos %>%
mutate(caja_trayectoria_edit = str_remove(caja_trayectoria,
pattern = "N° ")) %>%
select(caja_trayectoria, caja_trayectoria_edit) %>%
select(caja_trayectoria, caja_trayectoria_edit) # solo para ver mejor el resultado
## # A tibble: 1,191 x 2
## caja_trayectoria caja_trayectoria_edit
## <chr> <chr>
## 1 "\nSenador institucional \n1998- 2006\n" "\nSenador institucional \n1998- 2006\n"
## 2 "\nDiputado \n2010- 2014\nDistrito N° 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene" "\nDiputado \n2010- 2014\nDistrito 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene"
## 3 "\nDiputado \n2006- 2010\nDistrito N° 24Partido por la Democracia" "\nDiputado \n2006- 2010\nDistrito 24Partido por la Democracia"
## 4 "\nDiputado \n2002- 2006\nDistrito N° 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier" "\nDiputado \n2002- 2006\nDistrito 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier"
## 5 "\nDiputado \n1998- 2002\nDistrito N° 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada" "\nDiputado \n1998- 2002\nDistrito 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada"
## 6 "\nDiputado \n1994- 1998\nDistrito N° 52Partido Demócrata Cristiano" "\nDiputado \n1994- 1998\nDistrito 52Partido Demócrata Cristiano"
## 7 "\nDiputado \n1990- 1994\nDistrito N° 52Partido Demócrata Cristiano" "\nDiputado \n1990- 1994\nDistrito 52Partido Demócrata Cristiano"
## 8 "\nDiputado \n2006- 2010\nDistrito N° 5Partido Renovación NacionalPrecedido por: Carlos Vilches GuzmánSucedido por: Carlos V~ "\nDiputado \n2006- 2010\nDistrito 5Partido Renovación NacionalPrecedido por: Carlos Vilches GuzmánSucedido por: Carlos ~
## 9 "\nDiputado \n2014- 2018\nDistrito N° 37 Independiente" "\nDiputado \n2014- 2018\nDistrito 37 Independiente"
## 10 "\nDiputado \n2010- 2014\nDistrito N° 37 Izquierda Ciudadana" "\nDiputado \n2010- 2014\nDistrito 37 Izquierda Ciudadana"
## # ... with 1,181 more rows
Patrones más complejos con expresiones regulares (regex)
Fuentes: Kelly Vaughn, Programmer Humor y Towards Data Science.
Hasta aquí hemos utilizado patrones muy simples y específicos, por medio de series textuales de caracteres. Pero a menudo la información de nuestras cadenas de texto sigue patrones más generales. Por ejemplo, ¿cómo podemos obtener el año de inicio de cada período? Sabemos que todos tienen cuatro dígitos, y siempre son los primeros cuatro dígitos que aparecen. Conociendo esto, podemos extraerlos de nuestras cadenas:
df_legisladores_cargos %>%
mutate(inicio_per = str_extract(caja_trayectoria, pattern = "\\d{4}")) %>%
select(caja_trayectoria, inicio_per) # solo para ver mejor el resultado
## # A tibble: 1,191 x 2
## caja_trayectoria inicio_per
## <chr> <chr>
## 1 "\nSenador institucional \n1998- 2006\n" 1998
## 2 "\nDiputado \n2010- 2014\nDistrito N° 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene" 2010
## 3 "\nDiputado \n2006- 2010\nDistrito N° 24Partido por la Democracia" 2006
## 4 "\nDiputado \n2002- 2006\nDistrito N° 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier" 2002
## 5 "\nDiputado \n1998- 2002\nDistrito N° 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada" 1998
## 6 "\nDiputado \n1994- 1998\nDistrito N° 52Partido Demócrata Cristiano" 1994
## 7 "\nDiputado \n1990- 1994\nDistrito N° 52Partido Demócrata Cristiano" 1990
## 8 "\nDiputado \n2006- 2010\nDistrito N° 5Partido Renovación NacionalPrecedido por: Carlos Vilches GuzmánSucedido por: Carlos Vilches Guzmán" 2006
## 9 "\nDiputado \n2014- 2018\nDistrito N° 37 Independiente" 2014
## 10 "\nDiputado \n2010- 2014\nDistrito N° 37 Izquierda Ciudadana" 2010
## # ... with 1,181 more rows
Nuestro patrón esta escrito en el lenguaje de las expresiones regulares, que permite crear patrones generales en vez de específicos. Así, \\d
significa “un dígito” y {4}
significa cuatro veces. Puedes consultar una guía sobre las expresiones regulares en la segunda página del “torpedo” de esta unidad.
Por cierto, podemos obtener el año de fin del período haciendo un combo de extracción + remoción. A continuación tenemos una cadena de pipes dentro de otra! Tomamos “caja_trayectoria”, extraemos “- cuatro dígitos”, removemos “-” y pasamos a número, todo en una operación.
df_legisladores_cargos %>%
mutate(fin_per = caja_trayectoria %>%
str_extract(pattern = "- \\d{4}") %>%
str_remove("- ") %>%
as.numeric()) %>%
select(caja_trayectoria, fin_per) # solo para ver mejor el resultado
## # A tibble: 1,191 x 2
## caja_trayectoria fin_per
## <chr> <dbl>
## 1 "\nSenador institucional \n1998- 2006\n" 2006
## 2 "\nDiputado \n2010- 2014\nDistrito N° 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene" 2014
## 3 "\nDiputado \n2006- 2010\nDistrito N° 24Partido por la Democracia" 2010
## 4 "\nDiputado \n2002- 2006\nDistrito N° 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier" 2006
## 5 "\nDiputado \n1998- 2002\nDistrito N° 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada" 2002
## 6 "\nDiputado \n1994- 1998\nDistrito N° 52Partido Demócrata Cristiano" 1998
## 7 "\nDiputado \n1990- 1994\nDistrito N° 52Partido Demócrata Cristiano" 1994
## 8 "\nDiputado \n2006- 2010\nDistrito N° 5Partido Renovación NacionalPrecedido por: Carlos Vilches GuzmánSucedido por: Carlos Vilches Guzmán" 2010
## 9 "\nDiputado \n2014- 2018\nDistrito N° 37 Independiente" 2018
## 10 "\nDiputado \n2010- 2014\nDistrito N° 37 Izquierda Ciudadana" 2014
## # ... with 1,181 more rows
Hay tres tipos de constructos básicos en las expresiones regulares: pronombres o clases de caracteres (como \\d
), cuantificadores (como {4}
) y anclas.
Pronombres o clases de caracteres
Ya vimos \\d
, que es equivalente a “un dígito”. Otros pronombres comunes son: [:alpha:]
(una letra), \\w
(un caracter de “palabra”: letra o dígito), \\s
(un caracter de espacio) y .
(cualquier cosa).
Por cierto, ¿qué pasa si queremos buscar por algún caracter especial en expresiones regulares, como “.”?
vector_prueba <- c("Ley 20.000.", "Reglamento 201")
str_extract(vector_prueba, pattern = "\\d{2}.") # esto no es lo que queremos!
## [1] "20." "201"
Debemos “escapar” el caracter, antecediéndolo de “\”:
## [1] "20." NA
(Ejercicio b)
Genera una nueva variable en la base, que tenga solo la primera letra del nombre del(la) legislador(a). Tu código:
Cuantificadores
Vimos que {4}
busca exactamente cuatro repeticiones de un caracter en específico. También podemos pedir rangos: {2, 4}
(entre dos y cuatro), {2, }
(dos o más).
Muy utilizados son los cuantificadores *
(cero o más) y +
(uno o más), que pueden pensarse como abreviaciones para los rangos anteriores.
Por ejemplo, obtengamos la primera palabra de “caja_trayectoria”, utilizando el patrón “una o más letras”:
df_legisladores_cargos %>%
mutate(primera_pal_trayectoria = str_extract(caja_trayectoria,
pattern = "[:alpha:]+")) %>%
select(caja_trayectoria, primera_pal_trayectoria) # solo para ver mejor el resultado
## # A tibble: 1,191 x 2
## caja_trayectoria primera_pal_trayectoria
## <chr> <chr>
## 1 "\nSenador institucional \n1998- 2006\n" Senador
## 2 "\nDiputado \n2010- 2014\nDistrito N° 24Partido por la DemocraciaSucedido por: Jaime Hernán Gonzalo Pilowsky Greene" Diputado
## 3 "\nDiputado \n2006- 2010\nDistrito N° 24Partido por la Democracia" Diputado
## 4 "\nDiputado \n2002- 2006\nDistrito N° 24Partido por la DemocraciaPrecedido por: Tomás Jocelyn Holt Letelier" Diputado
## 5 "\nDiputado \n1998- 2002\nDistrito N° 52Partido Demócrata CristianoSucedido por: Fernando Meza Moncada" Diputado
## 6 "\nDiputado \n1994- 1998\nDistrito N° 52Partido Demócrata Cristiano" Diputado
## 7 "\nDiputado \n1990- 1994\nDistrito N° 52Partido Demócrata Cristiano" Diputado
## 8 "\nDiputado \n2006- 2010\nDistrito N° 5Partido Renovación NacionalPrecedido por: Carlos Vilches GuzmánSucedido por: Carlos Vilches Guzmán" Diputado
## 9 "\nDiputado \n2014- 2018\nDistrito N° 37 Independiente" Diputado
## 10 "\nDiputado \n2010- 2014\nDistrito N° 37 Izquierda Ciudadana" Diputado
## # ... with 1,181 more rows
(Ejercicio c)
Genera una nueva variable en la base, que tenga el distrito que aparece en “caja_trayectoria”. Aparte de cuantificadores, aquí vale la pena utilizar un combo de extracción + remoción. Tu código:
Anclas
Podemos utilizar anclas para solo capturar las partes iniciales o finales de la cadena.
Ancla final ($
):
df_legisladores_cargos %>%
mutate(ult_apellido = str_extract(nombre_comp,
pattern = "\\w+$")) %>%
select(nombre_comp, ult_apellido) # solo para ver mejor el resultado
## # A tibble: 1,191 x 2
## nombre_comp ult_apellido
## <chr> <chr>
## 1 Marcos Aurelio Aburto Ochoa Ochoa
## 2 Enrique Accorsi Opazo Opazo
## 3 Enrique Accorsi Opazo Opazo
## 4 Enrique Accorsi Opazo Opazo
## 5 Mario Alberto Acuña Cisternas Cisternas
## 6 Mario Alberto Acuña Cisternas Cisternas
## 7 Mario Alberto Acuña Cisternas Cisternas
## 8 René Aedo Ormeño Ormeño
## 9 Sergio Aguiló Melo Melo
## 10 Sergio Aguiló Melo Melo
## # ... with 1,181 more rows
Ancla inicial (^
):
df_legisladores_cargos %>%
mutate(primer_nombre = str_extract(nombre_comp,
pattern = "^\\w+")) %>%
select(nombre_comp, primer_nombre) # solo para ver mejor el resultado
## # A tibble: 1,191 x 2
## nombre_comp primer_nombre
## <chr> <chr>
## 1 Marcos Aurelio Aburto Ochoa Marcos
## 2 Enrique Accorsi Opazo Enrique
## 3 Enrique Accorsi Opazo Enrique
## 4 Enrique Accorsi Opazo Enrique
## 5 Mario Alberto Acuña Cisternas Mario
## 6 Mario Alberto Acuña Cisternas Mario
## 7 Mario Alberto Acuña Cisternas Mario
## 8 René Aedo Ormeño René
## 9 Sergio Aguiló Melo Sergio
## 10 Sergio Aguiló Melo Sergio
## # ... with 1,181 more rows
En este caso, el ancla inicial no es necesaria, pero a veces es útil para tomar en cuenta ambigüedades.
(Ejercicio d)
Genera una nueva base de datos, que tenga variables con el cargo, año de inicio (ya lo hicimos), año de término (ya lo hicimos), distrito (ya lo hicimos) y partido. Con esto listo, habremos conseguido nuestro objetivo inicial. Asegúrate de que las variables tengan los tipos correctos de vectores –utiliza as.numeric()
cuando corresponda–. Tu código:
Combinar pronombres en expresiones regulares
¿Qué pasa si queremos extraer la cadena “Diputado” o “Diputada”, según corresponda? Podríamos hacer algo como esto, por ejemplo:
df_legisladores_cargos %>%
mutate(cadena = str_extract(caja_trayectoria, "Diputad\\w")) %>%
select(cadena)
## # A tibble: 1,191 x 1
## cadena
## <chr>
## 1 <NA>
## 2 Diputado
## 3 Diputado
## 4 Diputado
## 5 Diputado
## 6 Diputado
## 7 Diputado
## 8 Diputado
## 9 Diputado
## 10 Diputado
## # ... with 1,181 more rows
Funciona bien, pero tal vez es demasiado general. A veces queremos ser más específicos/as y decir, con expresiones regulares, la cadena que comience con “Diputad” y siga con “a” u “o”. Podemos hacer esto de la siguiente forma:
df_legisladores_cargos %>%
mutate(cadena = str_extract(caja_trayectoria, "Diputad[ao]")) %>% # caracteres permitidos
select(cadena)
## # A tibble: 1,191 x 1
## cadena
## <chr>
## 1 <NA>
## 2 Diputado
## 3 Diputado
## 4 Diputado
## 5 Diputado
## 6 Diputado
## 7 Diputado
## 8 Diputado
## 9 Diputado
## 10 Diputado
## # ... with 1,181 more rows
Fíjate en el siguiente ejemplo. Estaríamos capturando solo los elementos número 2 y 3.
## [1] FALSE TRUE TRUE
(Ejercicio e)
Genera una nueva base de datos, que tenga variables con el cargo, año de inicio (ya lo hicimos), año de término (ya lo hicimos), distrito (ya lo hicimos) y partido. Con esto listo, habremos conseguido nuestro objetivo inicial. Asegúrate de que las variables tengan los tipos correctos de vectores –utiliza as.numeric()
cuando corresponda–. Tu código:
(Ejercicio f)
Carguemos esta nueva base, que tiene la caja de antecedentes para cada legislador (noten cómo cambia la unidad de análisis de la base).
## Parsed with column specification:
## cols(
## nombre_comp = col_character(),
## id = col_double(),
## caja_antecedentes = col_character()
## )
## [1] "\n Nombre: Marcos Aurelio Aburto Ochoa\n Nacimiento: \n25 de Mayo de 1916\n\nValdivia\n Profesión: Abogado"
## [2] "\n Nombre: Enrique Accorsi Opazo\n Nacimiento: \n17 de Agosto de 1948\n\nSantiago\n Profesión: Médico"
## [3] "\n Nombre: Mario Alberto Acuña Cisternas\n Nacimiento: \n26 de Septiembre de 1951\n\n\n Profesión: Ingeniero Agrónomo"
## [4] "\n Nombre: René Aedo Ormeño\n Nacimiento: \n4 de Febrero de 1960\n\n\n Profesión: Médico Cirujano"
## [5] "\n Nombre: Sergio Aguiló Melo\n Nacimiento: \n9 de Febrero de 1953\n\nSantiago\n Profesión: Ingeniero Comercial"
## [6] "\n Nombre: Raúl Florcita Alarcón Rojas\n Nacimiento: \n15 de Octubre de 1945\n\n\n Profesión: Profesor normalista y Músico"
Genera variables para fecha de nacimiento y profesión.
Calcula la edad actual de cada legislador(a). Utiliza una fórmula sencilla, 2019 - año de nacimiento.
Obtén la distribución de edad para los/as diputados/as del período actual. Tip: para esto debes juntar las dos bases; puedes utilizar
left_join()
.(Difícil) Divide la distribución anterior por coalición.