我有一个字符串列表(DNA序列),包括A,T,C,G。我想找到所有匹配项并将其插入表中,这些表的所有列都是这些DNA字母的所有可能组合(4 ^ k;“k”是每个匹配项的长度-K-mer-必须由用户指定),并且行代表在列表中按顺序匹配。

可以说我的名单包括5个成员:

DNAlst<-list("CAAACTGATTTT","GATGAAAGTAAAATACCG","ATTATGC","TGGA","CGCGCATCAA")

我想设置k=2(2个字符),以便可以使用4^2=16组合,包括AA,AT,AC,AG,TA,TT,...
因此,我的表将包含5 rows16 columns。我想计算我的k-mers和列表成员之间的匹配数。

我想要的结果:df:
lstMemb AA AT AC AG TA TT TC ...
  1     2  1  1  0  0  3  0
  2       ...
  3
  4
  5

您能帮我在R中实现吗?

最佳答案

如果您正在寻找速度,那么显而易见的解决方案是 stringi 软件包。
stri_count_fixed函数用于计数模式。
现在,检查代码和基准!

DNAlst<-list("CAAACTGATTTT","GATGAAAGTAAAATACCG","ATTATGC","TGGA","CGCGCATCAA")
dna <- stri_paste(rep(c("A","C","G","T"),each=4),c("A","C","G","T"))
result <- t(sapply(DNAlst, stri_count_fixed,pattern=dna,overlap=TRUE))
colnames(result) <- dna
result
     AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT
[1,]  2  1  0  1  1  0  0  1  1  0  0  0  0  0  1  3
[2,]  5  1  1  2  0  1  1  0  2  0  0  1  2  0  1  0
[3,]  0  0  0  2  0  0  0  0  0  1  0  0  1  0  1  1
[4,]  0  0  0  0  0  0  0  0  1  0  1  0  0  0  1  0
[5,]  1  0  0  1  2  0  2  0  0  2  0  0  0  1  0  0



fstri <- function(x){
    t(sapply(x, stri_count_fixed,dna,T))
}
fbio <- function(x){
    t(sapply(x, function(x){x1 <-  DNAString(x); oligonucleotideFrequency(x1,2)}))
}

all(fstri(DNAlst)==fbio(DNAlst)) #results are the same
[1] TRUE

longDNA <- sample(DNAlst,100,T)
microbenchmark(fstri(longDNA),fbio(longDNA))
Unit: microseconds
           expr        min         lq        mean     median         uq        max neval
 fstri(longDNA)    689.378    738.184    825.3014    766.862    793.134   6027.039   100
  fbio(longDNA) 118371.825 125552.401 129543.6585 127245.489 129165.711 359335.294   100
127245.489/766.862
## [1] 165.9301

约为的165倍:)

关于regex - 匹配和计数R中的字符串(DNA的k-mer),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26600735/

10-12 22:39
查看更多