基于多种模式提取字符串

Extract strings based on multiple patterns

我有成千上万的 DNA 序列看起来像这样:)。

ref <- c("CCTACGGTTATGTACGATTAAAGAAGATCGTCAGTC", "CCTACGCGTTGATATTTTGCATGCTTACTCCCAGTC", 
         "CCTCGCGTTGATATTTTGCATGCTTACTCCCAGTC")

我需要提取 CTACGCAGTC。但是,这些序列中的许多情况都会出现错误 (删除、插入、替换)。有什么方法可以根据 Levenshtein 距离来解释不匹配吗?

ref <- c("CCTACGGTTATGTACGATTAAAGAAGATCGTCAGTC", "CCTACGCGTTGATATTTTGCATGCTTACTCCCAGTC", 
         "CCTCGCGTTGATATTTTGCATGCTTACTCCCAGTC")

qdapRegex::ex_between(ref, "CTACG", "CAGTC")
#> [[1]]
#> [1] "GTTATGTACGATTAAAGAAGATCGT"
#> 
#> [[2]]
#> [1] "CGTTGATATTTTGCATGCTTACTCC"
#> 
#> [[3]]
#> [1] NA

reprex()
#> Error in reprex(): could not find function "reprex"

reprex package (v2.0.1)

于 2021-12-18 创建

这样我也可以在最后一种情况下提取序列。

更新:我可以创建一个具有特定 Levenshtein 距离的字典,然后将其与每个序列匹配吗?

使用 aregexec,使用 sprintf 构建正则表达式模式,最后使用 gsub 删除匹配项。将其放入 Vectorized 函数中以避免脚本因 lapplys 或循环而过载。

在正则表达式中,.* 指的是各个字母之前(resp。之后)的所有内容。请注意,您可能需要使用您的真实数据调整 max.distance=

fu <- Vectorize(function(x) {
  p1 <- regmatches(x, aregexec('.*CTACG', x, max.distance=0.1))
  p2 <- regmatches(x, aregexec('CAGTC.*', x, max.distance=0.1))
  gsub(sprintf('%s|%s', p1, p2), '', x, perl=TRUE)
})

fu(ref)
# CCTACGGTTATGTACGATTAAAGAAGATCGTCAGTC CCTACGCGTTGATATTTTGCATGCTTACTCCCAGTC 
#          "GTTATGTACGATTAAAGAAGATCGT"          "CGTTGATATTTTGCATGCTTACTCC" 
# CCTCGCGTTGATATTTTGCATGCTTACTCCCAGTC 
#          "CGTTGATATTTTGCATGCTTACTCC" 

数据:

ref <- c("CCTACGGTTATGTACGATTAAAGAAGATCGTCAGTC", "CCTACGCGTTGATATTTTGCATGCTTACTCCCAGTC", 
         "CCTCGCGTTGATATTTTGCATGCTTACTCCCAGTC")