【问题标题】:Extract a string or value based on specific word before and a % sign after in R在 R 中根据之前的特定单词和之后的 % 符号提取字符串或值
【发布时间】:2019-11-30 05:31:23
【问题描述】:

我有一个包含数千行段落的文本列,我想提取“Capacity > x%”的值。操作符号可以是>,<,=, ~... 我基本上需要操作符号和整数值(例如gsub, grep,grepl, string_extract,等等。没有一个很好的结果。我不确定百分比符号是否在抛出它,或者我只是没有得到代码结构。感谢您的帮助。 以下是我尝试过的一些代码(aa 是 df,TEXT 是 col 名称):

str_extract(string =aa$TEXT, pattern = perl("(?<=LVEF).*(?=%)"))

gsub(".*[Capacity]([^.]+)[%].*", "\\1", aa$TEXT)

genXtract(aa$TEXT, "Capacity", "%")

gsub("%.*$", "%", aa$TEXT)

grep("^Capacity.*%$",aa$TEXT)

【问题讨论】:

  • 你能编辑你的问题并提供一个小的reproducible example你的数据集吗?
  • 字符向量是否总是相同的字符数?如果是这样,您也许可以使用substr()

标签: r string filtering text-mining text-extraction


【解决方案1】:

由于您没有提供可重现的示例,因此我自己创建了一个并在此处使用。

我们可以使用sub 提取"Capacity" 之后的所有内容,直到一个数字和% 符号。

sub(".*Capacity(.*\\d+%).*", "\\1", aa$TEXT)
#[1] " > 10%"  " < 40%"  " ~ 230%"

或者str_extract

stringr::str_extract(aa$TEXT, "(?<=Capacity).*\\d+%")

数据

aa <- data.frame(TEXT = c("This is a temp text, Capacity > 10%", 
                    "This is a temp text, Capacity < 40%", 
                    "Capacity ~ 230% more text  ahead"), stringsAsFactors = FALSE)

【讨论】:

  • 谢谢,因为您的子代码捕获了我需要的大部分内容,但如果有 = 符号与 ,则错过了它。如果条件不满足,我喜欢它进入 NA 的格式。欣赏它。
  • @Shawn 我在上面发布的解决方案是基于我对您的数据的理解,这些数据可能是真实的,也可能不是真实的,这就是为什么您应该分享一个代表您的实际数据的可重复示例,所以这样的优势没有遗漏案例。
  • 哦,我完全意识到我没有提交示例,因此肯定会丢失一些细微差别。我非常感谢您的帮助和意见,并尝试了您建议的代码以显示其优点/缺点。老实说,我已经多次查看有关提供示例数据/示例的说明,但它似乎不适用于我的示例。如果您有时间,我很感激您离线提供的任何建议。再次感谢您的支持。
【解决方案2】:

gsub 解决方案

我认为您的 gsub 解决方案非常接近,但没有带上百分号,因为它在括号之外。所以这样的事情应该可以工作(结果分配给capacity 列):

aa$capacity &lt;- gsub(".*[Capacity]([^.]+%).*", "\\1", aa$TEXT)

替代方法

当没有运算符匹配时,gsub 方法将匹配整个字符串。为了避免这种情况,我们可以使用带有更具体正则表达式的 stringr 包:

library(magrittr)
library(dplyr)
library(stringr)

aa %>% 
  mutate(capacity = str_extract(TEXT, "(?<=Capacity\\s)\\W\\s?\\d+\\s?%")) %>%
  mutate(Capacity = str_squish(Capacity)) # Remove excess white space

当没有匹配项时,此代码将提供NA,我相信这是您想要的行为。

【讨论】:

  • 您的 gsub 代码捕获了我需要的内容。有没有办法在不满足条件的情况下放置 NA,而不是返回单元格中的整个文本,好吗?另外,如何将结果放在此文本所在位置旁边的新列中?非常感谢您的帮助。
  • 编辑了我的答案以将结果重新分配给数据框。
  • 太棒了!再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 2021-10-28
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多