【问题标题】:Regex R substituting in a vector of replacements with parentheses正则表达式 R 用括号替换向量
【发布时间】:2016-02-24 05:59:39
【问题描述】:

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

x <- "CTTTANNNNNNNYG"

我想用长度可能不同的不同字符串替换 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)")

如果我想将向量 a 中的字母替换为向量 b 中的对应字母,我想将字符串 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() 无济于事。任何帮助将不胜感激。

【问题讨论】:

标签: regex r


【解决方案1】:

由于替换是“固定的”并且每个只涉及一个字母,因此您可以在不使用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"

【讨论】:

    【解决方案2】:

    我们可以从library(qdap)使用mgsub

    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"
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-10
        • 2020-01-07
        • 1970-01-01
        • 2011-10-26
        • 1970-01-01
        • 2013-03-13
        相关资源
        最近更新 更多