如何在两个DNA序列之间找到可变位点的数量

时间:2014-11-14 06:28:37

标签: r string seq

有没有办法可以使用R找到一对核苷酸序列的可变位点数以及哪些位点可变?

例如。

Seq1=ATGCCCCGTAATGC
Seq2=AGGCAACGTAAAGC

我希望变量站点的数量为5,位置2,3,5,6,12为变量。 有没有办法在R?中做到这一点?

2 个答案:

答案 0 :(得分:1)

尝试Biostrings

library(Biostrings)
s1 <- as.integer(DNAString(Seq1))
s2 <- as.integer(DNAString(Seq2))
which(s1!=s2)
#[1]  2  5  6 12

基准

 Seq1 <- paste(rep(Seq1,1e6), collapse='')
 Seq2 <- paste(rep(Seq2,1e6), collapse='')

 f1 <- function(){a <- unlist(strsplit(Seq1, ""))
             b <- unlist(strsplit(Seq2, ""))
             which(a!=b)}

 f2 <- function(){s1 <- as.integer(DNAString(Seq1))
             s2 <- as.integer(DNAString(Seq2))
             which(s1!=s2)}

 library(microbenchmark)
 microbenchmark(f1(), f2(), unit='relative', times=20L)
 #Unit: relative
 #expr     min       lq     mean   median       uq      max neval cld
 #f1() 5.06205 5.180931 4.480188 4.633281 4.749703 2.365516    20   b
 #f2() 1.00000 1.000000 1.000000 1.000000 1.000000 1.000000    20  a 

数据

Seq1 <- 'ATGCCCCGTAATGC'
Seq2 <- 'AGGCAACGTAAAGC'

答案 1 :(得分:0)

不确定 Biostrings 是否对内存优化有任何好处。您只需将 strsplit 用于短序列:

Seq1="ATGCCCCGTAATGC"
Seq2="AGGCAACGTAAAGC"

a <- unlist(strsplit(Seq1, ""))
b <- unlist(strsplit(Seq2, ""))
which(a!=b)
#[1]  2  5  6 12