silviaegt/dudas

propuesta de solución

Opened this issue · 5 comments

¡Hola, Silvia!
Aquí va mi propuesta de solución para tu consulta:

library(readr)
library(dplyr)
library(stringr)
library(tidyr)

metadata <- read_tsv("https://raw.githubusercontent.com/silviaegt/dudas/master/regex/metadata_german_departments", col_names = FALSE)

metadata %>%
  mutate(X1 = case_when(
    lead(str_detect(X1, "^Author:")) ~ str_c("Title: ", X1),
    TRUE ~ as.character(X1)
    )) %>% 
  filter(str_detect(X1, "^Author: |^Title: ")) %>% 
  separate(X1, into = c("variable", "data"), extra = "merge") %>% 
  mutate(id = rep(1:83, each = 2), .before = variable) %>% 
  pivot_wider(names_from = variable, values_from = data) 

Para que funcione, solo tendrías que fijarte si tu compu le pone por defecto X1 a la columna cuando importas los datos.

🤓

Uff qué hermosura de código, ¡gracias @rivaquiroga! Me quedó la duda nomás de por qué
lead(str_detect(X1, "^Author:")) ~ str_c("Title: ", X1)
Sí identifica al título a pesar de que éste se encuentra antes (lag) y no después (lead) del patrón para autor (o sea funcionó perfecto pero no sé por qué se me hizo contraintuitivo? Creo que no estoy entendiendo bien cómo funcionan esas funciones

Porque la condición está pensada desde la fila con el título. O sea, lo que está después (lead) de esa fila es el patrón para autor. Entonces, si lo que está debajo de una fila X coincide con str_detect(X1, "^Author:"), le agrega "Title: " a esa fila X.

@silviaegt, esta sería la versión actualizada para que tome los 100 registros:

text <- file("metadata_german_departments.txt", open = "r")
lines <- readLines(text, encoding = "UTF-8")
metadata <- as_tibble(lines)

metadata %>%
  mutate(value = case_when(
    lead(str_detect(value, "^Author:")) ~ str_c("Title: ", value),
    TRUE ~ as.character(value)
  )) %>% 
  filter(str_detect(value, "^Author: |^Title: ")) %>% 
  separate(value, into = c("variable", "data"), extra = "merge") %>% 
  mutate(id = rep(1:100, each = 2), .before = variable) %>% 
  pivot_wider(names_from = variable, values_from = data)  

(Al leerlo como data frame directo desde GitHub se saltaba las files que empezaban con caracteres especiales)

Uff está increíble @rivaquiroga, qué buen ojo para cachar que ese era el origen del error, ¡le daba vueltas y vueltas y nomás no se me ocurría por qué no jalaba!, ¡gracias!
En otras noticias se me ocurrió usar un group_by + mutate(row = row_number()) para no depender de saber cuántos elementos hay (y por si hay elementos que no están presentes) y creo que funciona bien!