根据之前的特定单词和 R 中的 % 符号提取字符串或值
Extract a string or value based on specific word before and a % sign after in R
我有一个包含数千行段落的文本列,我想提取“Capacity > x%
”的值。运算符号可以是 >,<,=, ~...
我基本上需要运算符号和整数值(例如 <40%)并将其放在同一行旁边的列中。我试过,删除 before/after 文本、gsub, grep
、grepl, 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
,我相信这是您想要的行为。
我有一个包含数千行段落的文本列,我想提取“Capacity > x%
”的值。运算符号可以是 >,<,=, ~...
我基本上需要运算符号和整数值(例如 <40%)并将其放在同一行旁边的列中。我试过,删除 before/after 文本、gsub, grep
、grepl, 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
,我相信这是您想要的行为。