通过评估反向引用替换 gsub 中的文本
Replacing text in gsub by evaluating a backreference
假设我有一些文本:
myF <- "lag.variable.1+1"
对于所有类似的表达式,我想得到以下结果:lag.variable.2
(即用实际总和替换 1+1
以下似乎不起作用,反向引用似乎没有在 eval(parse() bit ) 中执行:
myF<-gsub("(\.\w+)\.([0-9]+\+[0-9]+)",
paste0( "\1." ,eval(parse(text ="\2"))) ,
myF )
关于如何达到预期结果的任何提示?
谢谢!
我们可以使用gsubfn
library(gsubfn)
gsubfn("(\d+\+\d+)", ~ eval(parse(text = x)), myF)
#[1] "lag.variable.2"
gsubfn("\.([0-9]+\+[0-9]+)", ~ paste0(".", eval(parse(text = x))), myF2)
#[1] "lag.variable0.3 * lag.variable1.2 + 9892"
或 str_replace
library(stringr)
str_replace(myF, "(\d+\+\d+)", function(x) eval(parse(text = x)))
#[1] "lag.variable.2"
或者 strsplit
和 paste
的选项
v1 <- strsplit(myF, "\.(?=\d)", perl = TRUE)[[1]]
paste(v1[1], eval(parse(text = v1[2])), sep=".")
#[1] "lag.variable.2"
数据
myF <- "lag.variable.1+1"
myF2 <- "lag.variable0.3 * lag.variable1.1+1 + 9892"
以下是如何将您当前的模式与gsubfn
一起使用:
library(gsubfn)
x <- " lag.variable0.3 * lag.variable1.1+1 + 9892"
p <- "(\.\w+)\.([0-9]+\+[0-9]+)"
gsubfn(p, function(n,m) paste0(n, ".", eval(parse(text = m))), x)
# => [1] " lag.variable0.3 * lag.variable1.2 + 9892"
请注意,在这种情况下,匹配项将传递给可调用对象,其中第 1 组分配给 n
变量,第 2 组分配给 m
。 return 是第 1 组、.
和 eval
ed 第 2 组内容的串联。
请注意,您可以使用 PCRE 正则表达式(添加 perl=TRUE
参数)简化可调用部分 \K
,匹配重置运算符,丢弃目前匹配的所有文本:
p <- "\.\w+\.\K(\d+\+\d+)"
gsubfn(p, ~ eval(parse(text = z)), x, perl=TRUE)
[1] " lag.variable0.3 * lag.variable1.2 + 9892"
您可以通过将 \+
替换为 [-+/*]
来进一步增强模式以支持其他操作数,如果您需要支持带小数部分的数字,请将 [0-9]+
替换为 \d*\.?\d+
:
p <- "(\.\w+)\.(\d*\.?\d+[-+/*]\d*\.?\d+)"
## or a PCRE regex:
p <- "\.\w+\.\K(\d*\.?\d+[-+/*]\d*\.?\d+)"
假设我有一些文本:
myF <- "lag.variable.1+1"
对于所有类似的表达式,我想得到以下结果:lag.variable.2
(即用实际总和替换 1+1
以下似乎不起作用,反向引用似乎没有在 eval(parse() bit ) 中执行:
myF<-gsub("(\.\w+)\.([0-9]+\+[0-9]+)",
paste0( "\1." ,eval(parse(text ="\2"))) ,
myF )
关于如何达到预期结果的任何提示? 谢谢!
我们可以使用gsubfn
library(gsubfn)
gsubfn("(\d+\+\d+)", ~ eval(parse(text = x)), myF)
#[1] "lag.variable.2"
gsubfn("\.([0-9]+\+[0-9]+)", ~ paste0(".", eval(parse(text = x))), myF2)
#[1] "lag.variable0.3 * lag.variable1.2 + 9892"
或 str_replace
library(stringr)
str_replace(myF, "(\d+\+\d+)", function(x) eval(parse(text = x)))
#[1] "lag.variable.2"
或者 strsplit
和 paste
v1 <- strsplit(myF, "\.(?=\d)", perl = TRUE)[[1]]
paste(v1[1], eval(parse(text = v1[2])), sep=".")
#[1] "lag.variable.2"
数据
myF <- "lag.variable.1+1"
myF2 <- "lag.variable0.3 * lag.variable1.1+1 + 9892"
以下是如何将您当前的模式与gsubfn
一起使用:
library(gsubfn)
x <- " lag.variable0.3 * lag.variable1.1+1 + 9892"
p <- "(\.\w+)\.([0-9]+\+[0-9]+)"
gsubfn(p, function(n,m) paste0(n, ".", eval(parse(text = m))), x)
# => [1] " lag.variable0.3 * lag.variable1.2 + 9892"
请注意,在这种情况下,匹配项将传递给可调用对象,其中第 1 组分配给 n
变量,第 2 组分配给 m
。 return 是第 1 组、.
和 eval
ed 第 2 组内容的串联。
请注意,您可以使用 PCRE 正则表达式(添加 perl=TRUE
参数)简化可调用部分 \K
,匹配重置运算符,丢弃目前匹配的所有文本:
p <- "\.\w+\.\K(\d+\+\d+)"
gsubfn(p, ~ eval(parse(text = z)), x, perl=TRUE)
[1] " lag.variable0.3 * lag.variable1.2 + 9892"
您可以通过将 \+
替换为 [-+/*]
来进一步增强模式以支持其他操作数,如果您需要支持带小数部分的数字,请将 [0-9]+
替换为 \d*\.?\d+
:
p <- "(\.\w+)\.(\d*\.?\d+[-+/*]\d*\.?\d+)"
## or a PCRE regex:
p <- "\.\w+\.\K(\d*\.?\d+[-+/*]\d*\.?\d+)"