R извлекать данные из повторяющегося текста во фрейм данных - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь извлечь переменные недели, года и комментария (semana, año y comentario) из этого полу- и нерегулярного структурированного текста: http://www.virus.uc.cl/virus_respiratorios/aldia/coment_anteriores_reedit.html

Я могу получить недели и годына

a <- readtext("http://www.virus.uc.cl/virus_respiratorios/aldia/coment_anteriores_reedit.html")
sem <- str_match_all(a$text, "(?<=semana [a-zÁ-ú]{0,30} {0,1})[0-9]{1,2}")
año <- str_match_all(a$text,"2[0-9]{3}")

но так как не во всех абзацах есть информация за неделю, я получаю различное количество переменных

> lengths(sem)
[1] 301
> lengths(año)
[1] 411

, и я не могу вернуть комментарий между заголовками, потому чтоследующее регулярное выражение возвращает весь текст:

(?<=Comentario.*[0-9]{4})((.|\n|\r)*)(?=Comentario)

Пример вывода должен быть таким:

   Año Semana
1 2018     46
2 2017     NA
3 2016     44
                                                                                                   Comentario
1       Las consultas por [...whole bunch of thech untill next “Comentario”...] > 14 años (39%).
2       Las consultas por [...whole bunch of thech untill next “Comentario”...] > 14 años (33%).
3 La información de  [...whole bunch of thech untill next “Comentario”...]  influenza B con 30%.

1 Ответ

0 голосов
/ 08 февраля 2019

Вот кое-что.Вместо создания сложного регулярного выражения мы разбиваем его на несколько шагов.Сначала мы разбиваем данные на строки и отфильтровываем соответствующие строки, затем регулярное выражение гораздо проще.

# Extract text
at <- a[["text"]]
# Split text by line
at_split <- strsplit(at, "\\n+")[[1]] # character vector of lines
# Extract only those lines that start with Comentario and contain at least one number
at_split_com <- at_split[str_detect(at_split, "^Comentario\\s") & str_detect(at_split, "\\d")]


df <- data.frame(
  # Year is just the first 4 digit number preceded by space
  Año = str_extract(at_split_com, "\\s\\d{4}"),
  # Week is assumed to be the first number in the line
  Semana = str_extract(at_split_com, "\\d+"),
  # THe whole line
  Comentario = at_split_com
)


head(df,10)
     Año Semana                                                                                Comentario
1   2018     46                Comentario semanal, semana epidemiológica 46: Del 19 al 25 noviembre, 2018
2   2018     45                 Comentario semanal, semana epidemiológica 45: Del 5 al 11 noviembre, 2018
3   2018     44 Comentario semanal, semana epidemiológica 44: Desde el 29 de octubre al 4 noviembre, 2018
4   2018     41              Comentario semanal, semana epidemiológica 41: Desde el 8 al 14 octubre, 2018
5   2018     39          Comentario semanal, semana epidemiológica 39: Desde el 24 al 30 septiembre, 2018
6   2018     38          Comentario semanal, semana epidemiológica 38: Desde el 17 al 23 septiembre, 2018
7   2018     36         Comentario semanal, semana epidemiológica 36: Desde el 3 al 9 de septiembre, 2018
8   2018     35 Comentario semanal, semana epidemiológica 35: Desde el 27 agosto al 2 de septiembre, 2018
9   2018     30            Comentario semanal, semana epidemiológica 30: Desde el 23 al 29 de julio, 2018
10  2018     28             Comentario semanal, semana epidemiológica 28: Desde el 9 al 15 de julio, 2018
...