在R中存储长串(DNA序列)

时间:2015-02-08 21:44:00

标签: r string

我编写了一个函数,可以查找长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)
}

基本上,我的问题是......是否有任何解决字符串类中字符限制的方法?

2 个答案:

答案 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)