根据之前的特定单词和 R 中的 % 符号提取字符串或值

Extract a string or value based on specific word before and a % sign after in R

我有一个包含数千行段落的文本列,我想提取“Capacity > x%”的值。运算符号可以是 >,<,=, ~... 我基本上需要运算符号和整数值(例如 <40%)并将其放在同一行旁边的列中。我试过,删除 before/after 文本、gsub, grepgrepl, string_extract 等 None,效果很好。我不确定百分号是否在抛出它,或者我只是没有得到代码结构。感谢您的协助。 这是我试过的一些代码(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)

由于你没有提供可复现的例子,我自己做了一个,用在这里。

我们可以使用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)

gsub 解决方案

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

aa$capacity <- 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,我相信这是您想要的行为。