Clase 2: Trabajo con listas
y expresiones regulares

Web scraping y acceso a datos desde la web


Cristián Ayala
Director DESUC

30 de mayo de 2024

Hoy veremos

Motivación

  • Desde la web, tendremos situaciones donde obtendremos listas de objetos de texto que deben ser procesados.

  • Se encontará datos en json.

  • La manipulación de datos jerárquicos desde la web es análoga al trabajo con listas en R.

  • Para trabajar con listas directamente en R usaremos funciones del paquete purrr.

  • Para procesar texto usaremos el paquete stringr.

Manipulación de listas

purrr

purrr: guía

La función principal es map y su idea general es:

para cada
objeto en la lista
haga función.

Otra manera de pensar un loop.

purrr cheatsheets

Bajar pdf

purrr: fundamento 1

lista de ejemplo

(l <-  list(a = c('caso' = 1:2),
            b = c('caso' = 4:5)))
$a
caso1 caso2 
    1     2 

$b
caso1 caso2 
    4     5 

Sumemos los elementos de cada elemento de la lista con un for–loop.

for (i in seq_along(l)) {
  print(sum(l[[i]]))
}
[1] 3
[1] 9

purrr: fundamento 2

lista de ejemplo

(l <-  list(a = c('caso' = 1:2),
            b = c('caso' = 4:5)))
$a
caso1 caso2 
    1     2 

$b
caso1 caso2 
    4     5 

Suma de cada elemento de la lista.

l |> purrr::map(sum)
$a
[1] 3

$b
[1] 9

Extracción del elemento caso2

l |> purrr::map('caso2')
$a
[1] 2

$b
[1] 5

Transformación de lista a tibble

tibble::enframe(l)
# A tibble: 2 × 2
  name  value    
  <chr> <list>   
1 a     <int [2]>
2 b     <int [2]>

Manipulación de texto

stringr

stringr: guía

Las funciones de stringr permiten manipular texto según expresiones regulares.

Con ellas podemos definir patrones de búsqueda de texto.

stringr cheatsheets

Bajar pdf

stringr: fundamento

texto <- c('Viernes Santo', 'Sábado Santo', 
           'Elección 1', '18 septiembre')

Detectar elementos:

str_detect(texto, 'Elección')
[1] FALSE FALSE  TRUE FALSE

Obtener solo elementos detectados:

str_subset(texto, 'Santo')
[1] "Viernes Santo" "Sábado Santo" 

Extraer texto:

str_extract(texto, '\\d+') # números
[1] NA   NA   "1"  "18"

Reemplazo:

str_replace(texto, 'Santo', 'Cristiano')
[1] "Viernes Cristiano" "Sábado Cristiano"  "Elección 1"       
[4] "18 septiembre"    

Reemplazo de un grupo de texto:

str_replace(texto, '(.*) Santo', '\\1')
[1] "Viernes"       "Sábado"        "Elección 1"    "18 septiembre"
str_replace(texto, '(.*) (Santo)', '\\2_\\1')
[1] "Santo_Viernes" "Santo_Sábado"  "Elección 1"    "18 septiembre"

Remover texto:

str_remove(texto, ' ')
[1] "ViernesSanto" "SábadoSanto"  "Elección1"    "18septiembre"
str_remove(texto, '[aeiou]')
[1] "Vernes Santo" "Sábdo Santo"  "Elcción 1"    "18 sptiembre"
str_remove_all(texto, '[aeiou]')
[1] "Vrns Snt"  "Sábd Snt"  "Elccón 1"  "18 sptmbr"

Taller: ejemplo feriados

JSON con un listado de feriados en Chile

url <- 'https://apis.digital.gob.cl/fl/feriados'
resp <- jsonlite::read_json(url) 
resp |> (function(x) x[1:2])() |> str(2)
List of 2
 $ :List of 6
  ..$ nombre       : chr "Año Nuevo"
  ..$ comentarios  : chr ""
  ..$ fecha        : chr "2013-01-01"
  ..$ irrenunciable: chr "1"
  ..$ tipo         : chr "Civil"
  ..$ leyes        :List of 2
 $ :List of 6
  ..$ nombre       : chr "Todos los Días Domingos"
  ..$ comentarios  : chr ""
  ..$ fecha        : chr "2013-01-01"
  ..$ irrenunciable: chr "0"
  ..$ tipo         : chr "Civil"
  ..$ leyes        :List of 1

Vamos al código.

Recursos adicionales

Presentación y código en GitHub:
https://github.com/caayala/web_scraping_soc40XX_2024
https://caayala.github.io/web_scraping_soc40XX_2024


¡Gracias!


Cristián Ayala
https://blog.desuc.cl/
http://github.com/caayala