首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从列表中提取数据,并将其放入整洁的tibble,R

从列表中提取数据,并将其放入整洁的tibble,R
EN

Stack Overflow用户
提问于 2020-10-29 08:20:09
回答 1查看 201关注 0票数 0

我有一个列表(代码示例中的列表),我希望循环循环,从一个整洁的数据集中提取数据(代码示例中的目标数据)。该列表由5个元素组成,每个元素都应该在应用程序表单中表示一个页面。每个元素都是一个字符串。

  1. 从第一个元素中提取与单词数字和组织有关的信息。

  1. 在单词开始(元素3)和停止(元素5)之间,我的目标是提取与名称和信息相关的信息。这是我希望提取的冒号(:)、名称和信息后面的信息以及行间隔之间的信息。也许regex解决方案是可能的?在代码示例中有3个名称和3个信息。我努力构建一个通用函数,它可以在定义的边界内处理任意数量的名称和信息(start,

)。

我怎样才能在R中处理这个问题?感谢你的帮助。我使用str_extract_all()做了一些尝试,但都失败了。

代码语言:javascript
运行
复制
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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-29 12:33:48

我想这就是你想要达到的目标:

代码语言:javascript
运行
复制
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)") )
代码语言:javascript
运行
复制
# 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 )。查找( (?<=pat))以检查以下内容(resp )。)字符匹配pat。

  • str_extract_all(..., "(?<=start).+?(?=stop)")获取介于start和stop.
  • name: *([^\\r\\n]+?)\\r\\n.*?info: *([^\\r\\n]+?)\\r\\n之间的文本:
    1. name: * match name:,后面跟着任意数量的spaces.
    2. ([^\\r\\n]+?)捕获一个或多个字符,这些字符与回车\r和换行符\r不同,greedy.
    3. \\r\\n.*?量词是为了匹配尽可能少的字符数,即在正则表达式中,使+量词非\r\n匹配文字\r\n.*? --任何数量的字符都比possible.
    4. ([^\\r\\n]+?)\\r\\n捕获的少.然后匹配一个文字\r\n.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64587305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档