silviaegt / dudas

un espacio para compartir preguntas que tengo
MIT License
1 stars 1 forks source link

propuesta de solución #2

Open rivaquiroga opened 3 years ago

rivaquiroga commented 3 years ago

¡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.

:nerd_face:

silviaegt commented 3 years ago

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

rivaquiroga commented 3 years ago

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.

rivaquiroga commented 3 years ago

@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)  
rivaquiroga commented 3 years ago

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

silviaegt commented 3 years ago

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!