Regex 正则表达式R在带括号的替换向量中替换

Regex 正则表达式R在带括号的替换向量中替换,regex,r,Regex,R,假设我有一个像这样的字符串x x <- "CTTTANNNNNNNYG" 我尝试过使用mapply(gsub,a,b,x)和str_replace(),但没有效果。任何帮助都将不胜感激。我们可以使用library(qdap) 如果您想用基函数实现这一点,基本上需要按顺序进行每个替换(gsub不是以这种方式矢量化的)。这里有一种方法 Reduce( function(x, replace) { gsub(replace$pattern, replace$value,

假设我有一个像这样的字符串
x

x <- "CTTTANNNNNNNYG"

我尝试过使用
mapply(gsub,a,b,x)
str_replace()
,但没有效果。任何帮助都将不胜感激。

我们可以使用
library(qdap)


如果您想用基函数实现这一点,基本上需要按顺序进行每个替换(
gsub
不是以这种方式矢量化的)。这里有一种方法

Reduce(
    function(x, replace) {
        gsub(replace$pattern, replace$value, x)
    }, 
    Map(function(a,b) list(pattern=a, value=b), a, b), 
    init=x
)
# [1] "CTTTA(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(C|T)G"
我们使用
Map
生成成对的匹配/替换值,然后使用
Reduce

将它们依次应用于字符串,因为替换是“固定的”,并且只涉及每个字母,所以您可以在不使用
regex
或任何附加包的情况下获得相同的结果。例如:

vapply(strsplit(x,"",fixed=TRUE),function(z) paste(setNames(b,a)[z],collapse=""),"")
#[1] "CTTTA(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(C|T)G"
可能重复的
library(qdap)
mgsub(a, b, x)
#[1] "CTTTA(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(C|T)G"
Reduce(
    function(x, replace) {
        gsub(replace$pattern, replace$value, x)
    }, 
    Map(function(a,b) list(pattern=a, value=b), a, b), 
    init=x
)
# [1] "CTTTA(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(C|T)G"
vapply(strsplit(x,"",fixed=TRUE),function(z) paste(setNames(b,a)[z],collapse=""),"")
#[1] "CTTTA(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(C|T)G"