我编写了一个函数,可以查找长DNA序列中子序列的索引。当我的较长DNA序列<1时,它起作用。大约4000个字符。但是,当我尝试将相同的函数应用于更长的序列时,控制台给我一个+而不是一个&gt; ...这让我相信它是字符串的长度是问题。
例如:当较长的序列为:“GATATATGCATATACTT”,子序列为:“ATAT”时,我得到索引“1,3,9”(基于0)
dnaMatch <- function(dna, sequence) {
ret <- list()
k <- str_length(sequence)
c <- str_length(dna) - k
for(i in 1:(c+1)) {
ret[i] = str_sub(dna, i, i+k-1)
}
ret <- unlist(ret)
TFret <- lapply (ret, identical, sequence)
TFret <- which(unlist(TFret), arr.ind = TRUE) -1
print(TFret)
}
基本上,我的问题是......是否有任何解决字符串类中字符限制的方法?
答案 0 :(得分:4)
我可以复制nrussell的示例,但这会正确分配x<-paste0(rep("abcdef",1000),collapse="")
- 可能的解决方法是将字符串写入.txt
文件并将.txt
文件读入R直接:
test.txt是一个长度为6000字符的字符串。
`test<-read.table('test.txt',stringsAsFactors = FALSE)
length(class(test[1,1]))
[1] 1
class(test[1,1])
[1] "character"
nchar(test[1,1])
[1] 6000`
答案 1 :(得分:2)
为什么不在包seqinr中使用函数words.pos,而不是编写自己的函数。它似乎甚至适用于高达一百万个碱基对的字符串。
例如,
library(seqinr)
data(ec999)
myseq <- paste(ec999[[1]], collapse="")
myseq <- paste(rep(myseq,100), collapse="")
words.pos("atat", myseq)