从字符串生成所有有缺口的k-mer序列

时间:2018-04-04 01:44:30

标签: r string

我感兴趣的是从序列中产生所有缺口kmer,其中gapped-kmer被定义为长度为k的序列,由长度为k的另一个序列分隔多达m个位置。因此,例如,"序列CAGAT gappy对 k = 1且m = 2的核发现了单体对,其间具有0到2个不相关的位置。即它找到特征CA,C.G,C..A,AG,A.A,A..T,GA,G.T和AT"

replacefxn <- function(x, k, m) {
  substr(x, k + 1, k + m) <- paste(rep("X", m), collapse = "")
  return(x)
}
gappedkmersfxn <- function(x, k, m) {
  n <- (2 * k + m)
  subseq <-
    substring(x, seq(from = 1, to = (nchar(x) - n + 1)), seq(from = n, to = nchar(x)))
  return(sapply(subseq, replacefxn, k, m))
}



allgappedkmersfxn <- function(x, k, m) {
  kmers <- list()
  for (i in 0:m) {
    kmers[[i]] <- gappedkmersfxn(x, k, i)
  }
  kmers <- unlist(kmers)
  return(kmers)
}

allgappedkmersfxn是我目前实现的方式,但它没有添加没有间隙的特征(m是最大间隙,但从0到m),因此没有给我所有所需的功能(参见&#34; CAGAT&#34;)的例子。此外,当一次执行数百万个序列时,它非常缓慢且效率低下。它的编码也很差,但由于R的经验有限,我不知道如何改进它。

在确保所有预期的子序列(例如:CAGAT - > CA,CG,C..A,AG,AA,A..T,GA,GT和AT)时,最有效的方法是什么?对于k = 1,m = 2)包含在输出中?

谢谢!

1 个答案:

答案 0 :(得分:3)

您可能希望查看Bioconductor kebabs package中的gappy对内核的实现。

安装:

## try http:// if https:// URLs are not supported
source("https://bioconductor.org/biocLite.R")
biocLite("kebabs")

生成k = 1,m = 2内核:

library(kebabs)
gappyK1M2 <- gappyPairKernel(k = 1, m = 2)

从DNA序列生成显式表示:

dnaseqs <- DNAStringSet("CAGAT")
dnaseqsrep <- getExRep(dnaseqs, gappyK1M2)

k-mers存储在Dimnames插槽中:

dnaseqsrep@Dimnames[[2]]
[1] "A.A"  "AG"   "AT"   "A..T" "CA"   "C..A" "C.G"  "GA"   "G.T"