R从重复文本到数据框提取数据

时间:2019-02-07 19:06:05

标签: r regex stringr

我正在尝试从以下半结构和非规则结构化文本http://www.virus.uc.cl/virus_respiratorios/aldia/coment_anteriores_reedit.html

中提取周,年和注释的变量(semana,año和comentario)。

我有几周和几年的时间

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 :(得分:0)

这是什么。与其创建复杂的正则表达式,我们将其分解为几个步骤。首先是按行拆分数据并过滤出相关行,然后使用正则表达式要容易得多。

# 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