【问题标题】:storing long strings (DNA sequence) in R在 R 中存储长字符串(DNA 序列)
【发布时间】:2015-02-08 21:44:00
【问题描述】:

我编写了一个函数,可以找到长 DNA 序列中子序列的索引。当我的较长 DNA 序列小于 4000 个字符时,它可以工作。但是,当我尝试将相同的函数应用于更长的序列时,控制台给了我一个 + 而不是 >... 这让我相信问题出在字符串的长度上。

例如:当较长的序列是:“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)
}

基本上,我的问题是……有什么办法可以绕过字符串类中的字符限制?

【问题讨论】:

  • "控制台给我一个 + 而不是 >" - 这通常是由于缺少 )"'}。你有没有仔细检查你的代码是否有错别字?
  • 抱歉,澄清一下:当我尝试将任意变量设置为非常长的 DNA 序列时,控制台会提示我。即:dna
  • 我明白了,我能够通过运行 cat(paste0(rep("abcdef",1000),collapse=""))、复制输出并尝试将其分配给对象 x &lt;- "[paste copied text]" 来复制此问题。可能存在某种缓冲限制。
  • 我可以复制您的示例 nrussell,但这会正确分配 x&lt;-paste0(rep("abcdef",1000),collapse="")
  • 在 100k 长度的字符串上使用 dnaMatch(x, 'ATATAT')gregexpr('ATATAT', x) 分别是 49 秒和 0.003 秒。抱歉,没有耐心再运行你的循环了

标签: r string


【解决方案1】:

我可以复制 nrussell 的示例,但这会正确分配 x&lt;-paste0(rep("abcdef",1000),collapse="") - 一种潜在的解决方法是将字符串写入 .txt 文件并将 .txt 文件直接读入 R:

test.txt 是一个 6,000 字符长的字符串。

`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`

【讨论】:

  • 谢谢 - 这就是我最终要做的!
  • 酷!您也应该研究正则表达式匹配。在这种情况下,它可以成为救命稻草。
【解决方案2】:

与其自己编写函数,不如使用 seqinr 包中的 words.pos 函数。它似乎甚至适用于多达一百万个碱基对的字符串。

例如,

library(seqinr)
data(ec999)
myseq <- paste(ec999[[1]], collapse="")
myseq <- paste(rep(myseq,100), collapse="")
words.pos("atat", myseq)

【讨论】:

  • github.com/cran/seqinr/blob/master/R/words.pos.R 使用while 循环,增长对象,substr.. 可能不是有史以来最快的事情。而且只是regexpr 的包装器
  • 不是最快的,但她的示例表明她想要找到不相交的匹配项。
  • Basically, my question is... is there any way around the character-limitation in the string class? - 我认为她的问题实际上是关于 R 解释器缓冲区的问题,即它一次只能处理有限数量的输入到控制台的文本;与她的职能表现无关。
猜你喜欢
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 2011-11-30
  • 2021-04-09
  • 2019-05-15
相关资源
最近更新 更多