我感兴趣的是从序列中产生所有缺口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)包含在输出中?
谢谢!
答案 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"