繁体   English   中英

正则表达式R替换为带有括号的替换向量

[英]Regex R substituting in a vector of replacements with parentheses

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

x <- "CTTTANNNNNNNYG"

我想用可能不是f相同长度的不同字符串替换x中的每个字母。

a <- c("A","C","G","T","W","S","M","K","R","Y","B","D","H","V","N")
b <- c("A","C","G","T","(A|T)","(C|G)","(A|C)","(G|T)","(A|G)","(C|T)","(C|G|T)","(A|G|T)","(A|C|T)","(A|C|G)","(A|C|G|T)")

如果我想用向量b中的对应字母替换向量a中的字母,我想将字符串x操纵为:

"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"

我试过使用mapply(gsub, a,b,x)str_replace()无济于事。 任何帮助,将不胜感激。

我们可以使用mgsublibrary(qdap)

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"

由于替换是“固定的”,每个替换只包含一个字母,因此无需使用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"

如果要使用基本函数执行此操作,则基本上需要按顺序执行每个替换操作( 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依次将它们应用于字符串

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM