【发布时间】:2017-11-07 11:26:53
【问题描述】:
我尝试检测 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)
}
}
【问题讨论】:
标签: r pattern-matching