繁体   English   中英

从列表中提取数据并将其放入整洁的小标题中,R

[英]Extract data from a list and get it into a tidy tibble, R

我有一个列表(代码示例中的列表)我希望循环并从中提取数据并进入一个整洁的数据集(代码示例中的目标 tibble)。 该列表由 5 个元素组成,每个元素都假设代表申请表中的一个页面。 每个元素都是一个字符串。

  1. 我希望从第一个元素中提取与单词数量和组织相关的信息。

  2. 在单词 Start(element 3) 和 stop(element 5) 之间,我的目标是提取与 name 和 info 相关的信息。 这是名称和信息之后的冒号(:) 和我希望提取的换行符之间的信息。 也许正则表达式解决方案是可能的? 在代码示例中有 3 个名称和 3 个信息。 我努力构建一个通用函数,可以在定义的边界(开始、停止)内处理任意数量的名称和信息。

我怎么能在 R 中解决这个问题? 感谢任何帮助。 我使用 str_extract_all() 做了一些尝试,但都失败了。

library(tidyverse)

target <- tibble(number = c("10", "10", "10"),
          organization = c("TEST", "TEST", "TEST"),
       name = c("X", "Y", "Z"),
       info = c(12, 1, 43))

string1 <- "Application \r\n Date: 2020-09-23\r\n number: 10\r\n organization: TEST \r\nMail: x@x.com\r\n
             Page 1(5)\r\n"
string2 <- "Application \r\n Date: 2020-09-23\r\n ZZZZZZZZ\r\n
             Page 2(5)\r\n"
string3 <- "Application \r\n Date: 2020-09-23\r\n Start\r\n name: X\r\ninfo: 12\r\nmiss: NO\r\nname: Y\r\ninfo: 1\r\nname: Z\r\
             Page 3(5)\r\n"
string4 <- "Application \r\n Date: 2020-09-23\r\n info: 43\r\n miss: YES\r\nPage 4(5)\r\n"
string5 <- "stop\r\nname: ZY\r\ninfo:45\r\nMISS:-\r\nPage 5(5)"

list <- as.list(c(string1, string2, string3, string4, string5))

我想这就是您想要实现的目标:

str <- paste0(string1, string2, string3, string4, string5)
str_extract_all(str, regex("(?<=start).+?(?=stop)", dotall = TRUE,ignore_case = TRUE))[[1]] -> strs

str_match_all(strs, regex("name: *([^\\r\\n]+?)\\r\\n.*?info: *([^\\r\\n]+?)\\r\\n", dotall=T))[[1]][,-1] -> mat

tibble(name=mat[,1], info=mat[,2], number=as.numeric(str_extract(str, "(?<=number: )\\d+")),organization=str_extract(str, "(?<=organization: ).+(?= +\\r)") )
# A tibble: 3 x 4
  name  info  number organization
  <chr> <chr>  <dbl> <chr>       
1 X     12        10 TEST        
2 Y     1         10 TEST        
3 Z     43        10 TEST  

说明:

我正在使用前瞻(?=pat) (resp.lookbehinds (?<=pat )) 来检查以下(相应的前)字符是否与 pat 匹配。

  • str_extract_all(..., "(?<=start).+?(?=stop)")获取开始和停止之间的文本。
  • name: *([^\\\\r\\\\n]+?)\\\\r\\\\n.*?info: *([^\\\\r\\\\n]+?)\\\\r\\\\n :
    1. name: *匹配name:后跟任意数量的空格。
    2. ([^\\\\r\\\\n]+?)捕获一个或多个不同于回车\\r和换行符\\r的字符, ? 量词是匹配可能的最少字符数,即在正则表达式中使+量词不贪婪。
    3. \\\\r\\\\n.*? 匹配文字\\r\\n.*? 尽可能少的任意数量的字符。
    4. ([^\\\\r\\\\n]+?)\\\\r\\\\n capture .... 然后匹配文字\\r\\n

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM