簡體   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