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

library(tidyverse)
df_legisladores_cargos <- read_csv("datos/df_legisladores_cargos.csv")
## 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”:

head(df_legisladores_cargos$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 “\”:

str_extract(vector_prueba, pattern = "\\d{2}\\.")
## [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.

c("Diputación", "Diputado", "Diputada") %>% str_detect("Diputad[ao]")
## [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).

df_legisladores <- read_csv("datos/df_legisladores.csv")
## Parsed with column specification:
## cols(
##   nombre_comp = col_character(),
##   id = col_double(),
##   caja_antecedentes = col_character()
## )
head(df_legisladores$caja_antecedentes)
## [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.