[英]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()
无济于事。 任何帮助,将不胜感激。
我们可以使用mgsub
从library(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.