我的回答不像@bartektartanus那么快。但是,它也非常快,而且我写了代码... :D
与其他代码相比,我的代码的优点是:
- 不需要安装未实现版本的
stri_count_fixed
- 对于大的k-mer,可能
stringi
包会变得非常慢,因为它必须为模式生成所有可能的组合,然后检查它们在数据中的存在并计算出它们出现的次数。
- 它还可以对长的单个和多个序列进行快速处理,并具有相同的输出。
- 您可以为
k
设置一个值,而不是创建一个模式字符串。
- 如果您在大序列中使用
k
大于12运行oligonucleotideFrequency
函数,则由于超额内存使用而导致函数冻结并重新启动R,而使用我的函数则运行非常快。
我的代码
sequence_kmers <- function(sequence, k){
k_mers <- lapply(sequence,function(x){
seq_loop_size <- length(DNAString(x))-k+1
kmers <- sapply(1:seq_loop_size, function(z){
y <- z + k -1
kmer <- substr(x=x, start=z, stop=y)
return(kmer)
})
return(kmers)
})
uniq <- unique(unlist(k_mers))
ind <- t(sapply(k_mers, function(x){
tabulate(match(x, uniq), length(uniq))
}))
colnames(ind) <- uniq
return(ind)
}
我只使用Biostrings
包来计算碱基数量...你可以使用其他选项,如stringi
来进行计数...
如果你删除k_mers lapply
和return(k_mers)
下面的所有代码,它将返回一个列表...包含所有k-mer及其对应的重复向量
sequence
在这里是一个长度为1000bp的序列
> sequence_kmers(sequence,4)[,1:10]
GTCT TCTG CTGA TGAA GAAC AACG ACGC CGCG GCGA CGAG
4 4 3 4 4 8 6 4 5 5
> sequence_kmers(c(sequence,sequence),4)[,1:10]
GTCT TCTG CTGA TGAA GAAC AACG ACGC CGCG GCGA CGAG
[1,] 4 4 3 4 4 8 6 4 5 5
[2,] 4 4 3 4 4 8 6 4 5 5
使用我的函数进行的测试:
> system.time({sequence_kmers(sequence,13)})
usuário sistema decorrido
0.08 0.00 0.08
> system.time({sequence_kmers(rep(sequence,50),4)})
user system elapsed
3.61 0.00 3.61
> system.time({sequence_kmers(rep(sequence,50),13)})
user system elapsed
3.63 0.00 3.62
使用 Biostrings
进行的测试:
#Slow 1 sequence 12-mers
> system.time({oligonucleotideFrequency(DNAString(sequence),12)})
user system elapsed
150.11 1.14 151.37
#Biostrings package freezes for a single sequence of 13-mers
> system.time({oligonucleotideFrequency(sequence,13)})
freezes, used all my 8gb RAM