如何根据特定模式使用stringr提取特定字符。
例如,如果我在一个整洁的模型表中有以下系数:
I(pmax(0,hp - 100))
我想用hp和100创建另外两列。
示例代码:
library(tidyverse)
library(broom)
library(stringr)
#pull in and gather data
mtcars1 <- as_tibble(mtcars)
mtcars1$cyl <- as.factor(mtcars$cyl)
#run model and produce model-summary table
model <- glm(mpg ~ cyl + hp + I(pmax(0, hp - 100)), data = mtcars1)
model_summary <- tidy(model)
如何根据特定模式使用stringr提取特定字符。
例如,如果我在一个整洁的模型表中有以下系数:
I(pmax(0,hp - 100))
我想用hp和100创建另外两列。
我在regex101.com上尝试了以下工作(特定正则表达式声明),但在r中没有。
model_summary_hp <- model_summary %>%
mutate(term1 = str_extract(term, regex("\I\(pmax\(0, ([a-z]+)\ - 100\)\)")),
knot = str_extract(term, regex("\I\(pmax\(0, [a-z]+ - ([0-9]+)\)\)")))
我收到以下错误:
Error: '\I' is an unrecognized escape in character string starting ""\I"
我不确定为什么它不能识别正则表达式语句。
答案 0 :(得分:1)
一个非常重要的事情是了解如何使用正则表达式在线测试程序:如果您在那里看到某些内容,并不意味着它在目标环境中的工作方式相同。由于您使用的是stringr
函数,因此必须确保您的模式与ICU引擎兼容,而regex101仅支持PCRE,JS,Python re
和Go正则表达式引擎。请注意,如果您使用(g)sub
,则必须确保正则表达式与TRE正则表达式引擎或PCRE兼容(添加perl=TRUE
时)。
现在,您需要提取2个值,这意味着您需要使用2个str_extract
或sub
个调用。
stringr
方法:
1) "(?<=I\\(pmax\\(0, )[a-z]+" # or
"(?<=I\\(pmax\\(0,\\s{0,10})[a-z]+"
2) "\\d+(?=\\)\\))"
此处,主要观点是:(?<=I\\(pmax\\(0, )
匹配当前位置左侧的I(pmax(0,
,但不会将匹配的文本放入匹配值中。 (?=\\)\\))
模式是一个积极的预测,需要在当前位置的右侧立即显示))
。
请注意,第一个正则表达式的第二个版本在regex101.com上不起作用,因为lookbehind模式在这里是约束宽度,而不是固定宽度。
sub
方法(TRE正则表达式):
1) sub("I\\(pmax\\(\\d+,\\s*([a-z]+)\\s*-\\s*\\d+\\)\\)","\\1", term)
2) sub("I\\(pmax\\(\\d+,\\s*[a-z]+\\s*-\\s*(\\d+)\\)\\)","\\1", term)
此处,重点是匹配整个字符串,捕获您需要的内容,并将占位符替换为此组\1
。