基于多种模式提取字符串
Extract strings based on multiple patterns
我有成千上万的 DNA 序列看起来像这样:)。
ref <- c("CCTACGGTTATGTACGATTAAAGAAGATCGTCAGTC", "CCTACGCGTTGATATTTTGCATGCTTACTCCCAGTC",
"CCTCGCGTTGATATTTTGCATGCTTACTCCCAGTC")
我需要提取
CTACG 和 CAGTC。但是,这些序列中的许多情况都会出现错误
(删除、插入、替换)。有什么方法可以根据 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
删除匹配项。将其放入 Vectorize
d 函数中以避免脚本因 lapply
s 或循环而过载。
在正则表达式中,.*
指的是各个字母之前(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")
我有成千上万的 DNA 序列看起来像这样:)。
ref <- c("CCTACGGTTATGTACGATTAAAGAAGATCGTCAGTC", "CCTACGCGTTGATATTTTGCATGCTTACTCCCAGTC",
"CCTCGCGTTGATATTTTGCATGCTTACTCCCAGTC")
我需要提取 CTACG 和 CAGTC。但是,这些序列中的许多情况都会出现错误 (删除、插入、替换)。有什么方法可以根据 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
删除匹配项。将其放入 Vectorize
d 函数中以避免脚本因 lapply
s 或循环而过载。
在正则表达式中,.*
指的是各个字母之前(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")