R:检测主题序列末尾的模式

时间:2017-11-07 11:26:53

标签: r pattern-matching

我试图检测DNA序列末端的模式。但我需要处理模式超出序列末尾的情况。

示例

pattern  : AATTGGCC
subject1 : AAAAAAATTGGCCATGCACAA
subject2 : ATGGGTGTAGTAATTG

所以这里subject2在序列的末尾有模式 结果:

subject1 : AAAAAAATTGGCCATGCACAA
                AATTGGCC
  start : 6
  end   : 13 

subject2 : ATGGGTGTAGTAATTG
                      AATTGGCC
  start : 12
  end   : 16

我的最终目标是删除模式之后的所有内容(包括模式)。

我的第一个想法是使用Biostrings包中的matchPattern函数来检查模式。如果未检测到从右侧逐渐修剪模式并重新执行匹配模式,例如:

pattern <- "AATTGGCC" 
subject <- "ATGGGTGTAGTAATTG"
i <- nchar(pattern)
m <- matchPattern(pattern=pattern,subject)
while(length(m)==0 && i>0){
  i <- i-1
  p <- substring(pattern,1,i)
  m <- matchPattern(pattern=p,subject)
}

结果:

    start end width
[1]    12  16     5 [AATTG] 

但我需要做成千上万的序列,也许这不是最优化的方式......

由于

编辑:

现在应该可行了。如果主题序列中有多个模式,则会在第一个模式的位置切割序列

trimRead <- function(pattern,subject){
  require(Biostrings)
  i <- nchar(pattern)
  m <- matchPattern(pattern=pattern,subject)
  while(length(m)==0 && i>1){
    i <- i-1
    p <- substring(pattern,1,i)
    subject.sub <- substring(subject,first = nchar(subject)-nchar(p)+1) 
    m <- matchPattern(pattern=p,subject.sub)
  }
  if(length(m)>0){
    s <- nchar(subject)-nchar(subject(m)) + start(m)[1]
    return(substring(subject,first=1,last=(s-1)))
  }else{
    return(subject)
  }
}

1 个答案:

答案 0 :(得分:3)

尝试Biostrings::pairwiseAlignment,与本地(Smith-Waterman)对齐:

require(Biostrings);
pattern <- "AATTGGCC";
subject <- "ATGGGTGTAGTAATTG";
m <- pairwiseAlignment(pattern = pattern, subject = subject, type = "local");
Views(m);
#  Views on a 16-letter BString subject
#subject: ATGGGTGTAGTAATTG
#views:
#    start end width
#[1]    12  16     5 [AATTG]

您还可以直接获取部分匹配的开始/结束位置(在subject坐标中):

start(subject(m));
#[1] 12
end(subject(m));
#[1] 16

无需人工修剪,这是Smith-Waterman algorithm的全部目的。