我有一个字符串列表(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 rows
和16 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/