在R中找到跨越两条线的模式

时间:2015-08-26 18:55:23

标签: r pattern-matching

如何找到跨越两行的模式

 a <- c("catgttggccaggcgtttctcctgacctcaggtgatctgcccgtctcatg", 
        "agtccaaaatgctgggattacaggcatgagccaccgcgtctggcTGTGCC", 
        "TCTCCATCTTAAATTCACCTCTCTGCCGGTTGCCTTGGTGAAAGTGGATT", 
        "CAAGGAAGGGGTCATCATGAGAGAGTGCCTGAGCTGAAGGGCAGGAGAGG", 
        "AGAGGAGGGGTCTGAGCACCTCAGCGAGGCCTCAATTAGGATCAGCAAAT", 
        "AAGAGATTGTTGCAAATGTTCTGCAAGATGCATTGTATAGAGCGATTCAC") 

我有一个超过10000行的文件。如何找到ex“atgagt”的模式。另外如何知道它们在哪一个位置

1 个答案:

答案 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" )