如何找到跨越两行的模式
a <- c("catgttggccaggcgtttctcctgacctcaggtgatctgcccgtctcatg",
"agtccaaaatgctgggattacaggcatgagccaccgcgtctggcTGTGCC",
"TCTCCATCTTAAATTCACCTCTCTGCCGGTTGCCTTGGTGAAAGTGGATT",
"CAAGGAAGGGGTCATCATGAGAGAGTGCCTGAGCTGAAGGGCAGGAGAGG",
"AGAGGAGGGGTCTGAGCACCTCAGCGAGGCCTCAATTAGGATCAGCAAAT",
"AAGAGATTGTTGCAAATGTTCTGCAAGATGCATTGTATAGAGCGATTCAC")
我有一个超过10000行的文件。如何找到ex“atgagt”的模式。另外如何知道它们在哪一个位置
答案 0 :(得分:1)
a2 <- tolower(paste(a, collapse=''))
line <- findInterval(as.numeric(gregexpr("atgagt", a2)[[1]]),c(-Inf,cumsum(nchar(a))))
position <- as.numeric(gregexpr("atgagt", a2)[[1]])
data.frame(line, position)
# line position
#1 1 2
#2 1 49
#3 2 80
我们使用base R
函数首先将字符串粘贴在一起。我们发现匹配的行创建了findInterval
的间隔。对于cumsum(nchar(a))
,还将考虑可变长度字符串。我在多个匹配项上测试了一个字符串和可变长度向量的代码。它应涵盖所有案例。
@DavidArenburg使用stringi
包的另一种方法:
library(stringi)
stri_locate_all_fixed(tolower(apply(matrix(a, ncol = 2, byrow = TRUE), 1, paste, collapse = "")), "atgagt", omit_no_match = TRUE)
[[1]]
start end
[1,] 2 7
[2,] 49 54
[3,] 80 85
[[2]]
start end
[[3]]
start end
数据强>
从评论(添加匹配测试):
a <- c("catgagtggccaggcgtttctcctgacctcaggtgatctgcccgtctcatg", "agtccaaaatgctgggataagtacaggcatgagtccaccgcgtctggcTGTGCC", "TCTCCATCTTAAATTCACCTCTCTGCCGGTTGCCTTGGTGAAAGTGGATT", "CAAGGAAGGGGTCATCATGAGAGAGTGCCTGAGCTGAAGGGCAGGAGAGG", "AGAGGAGGGGTCTGAGCACCTCAGCGAGGCCTCAATTAGGATCAGCAAAT", "AAGAGATTGTTGCAAATGTTCTGCAAGATGCATTGTATAGAGCGATTCAC" )