我试图检测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)
}
}
答案 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的全部目的。