我的回答没有@bartektartanus 快。但是,它也很快,我编写了代码......:D
与其他代码相比,我的代码的优点是:
- 不需要安装
stri_count_fixed的未实现版本
- 可能
stringi 包对于大型 k-mer 来说会变得非常慢,因为它
必须为模式生成所有可能的组合,然后,
检查它们在数据中的存在并计算它出现的次数。
- 它也适用于长 single 和 multiple 序列
同样的输出速度非常快。
- 您可以为
k 设置一个值,而不是创建模式字符串。
- 如果运行
oligonucleotideFrequency 时k 大于12
在一个大的序列中,函数会因内存使用过多而冻结,并且
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)
}
我只使用Biostringspackage 来计算碱基...您可以使用其他选项,例如stringi 来计算...
如果您删除 k_mers lapply 和 return(k_mers) 下面的所有代码,它只返回列表...所有 k-mers 以及相应的重复向量
sequence这里是1000bp的序列
#same output for 1 or multiple sequences
> 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
使用我的函数完成的测试:
#super fast for 1 sequence
> system.time({sequence_kmers(sequence,13)})
usuário sistema decorrido
0.08 0.00 0.08
#works fast for 1 sequence or 50 sequences of 1000bps
> system.time({sequence_kmers(rep(sequence,50),4)})
user system elapsed
3.61 0.00 3.61
#same speed for 3-mers or 13-mers
> 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