按顺序查找不同的模式

时间:2016-06-21 13:53:29

标签: r regex bioinformatics

如果我想在一个序列中找到两种不同的模式,我该怎么做 例如:

seq="ATGCAAAGGT"

模式

pattern=c("ATGC","AAGG")

我怎么能在序列中同时找到这两种模式?

我也想找到这些模式的位置,例如模式位置是1,4和5,8。

任何人都可以帮我吗?

3 个答案:

答案 0 :(得分:3)

让我们说你的序列文件只是序列的载体:

seq.file <- c('ATGCAAAGGT','ATGCTAAGGT','NOTINTHISONE')

您可以搜索这两个主题,然后返回一个真/假向量,使用以下单行标识两者是否存在:

grepl('ATGC', seq.file) & grepl('AAGG', seq.file)
[1]  TRUE  TRUE FALSE

让我们说序列向量是数据框d中的一列,它还包含一列ID值:

id <- c('s1','s2','s3')
d <- data.frame(id,seq.file)
colnames(d) <- c('id','sequence')

您可以在此数据框d附加一列,用于标识给定序列是否与此单行匹配:

d$match <- grepl('ATGC',d$sequence) & grepl('AAGG', d$sequence)
> print(d)
  id     sequence match
1 s1   ATGCAAAGGT  TRUE
2 s2   ATGCTAAGGT  TRUE
3 s3 NOTINTHISONE FALSE

以下for循环可以返回序列中每个模式的位置列表:

require(stringr)

for(i in 1: length(d$sequence)){
    out <- str_locate_all(d$sequence[i], pattern)
    first    <- c(out[[1]])
    first.o  <- paste(first[1],first[2],sep=',')
    second   <- c(out[[2]])
    second.o <- paste(second[1],second[2], sep=',')
    print(c(first.o, second.o))
}
[1] "1,4" "6,9"
[1] "1,4" "6,9"
[1] "NA,NA" "NA,NA"

答案 1 :(得分:2)

您可以尝试使用stringr库执行以下操作:

seq = "ATGCAAAGGT"
library(stringr)
str_extract_all(seq, 'ATGC|AAGG')
[[1]]
[1] "ATGC" "AAGG"

如果不具体了解您正在寻找的输出,这是我现在能提供的最佳效果。

答案 2 :(得分:1)

如何使用stringr查找开始和结束位置:

library(stringr)
seq <- "ATGCAAAGGT"
pattern <- c("ATGC","AAGG")
str_locate_all(seq, pattern)

#[[1]]
#     start end
#[1,]     1   4
#
#[[2]]
#     start end
#[1,]     6   9