——by不是杀杀
前几天遇见一个简单的问题,但是我当我实际面对它的时候却发现好像也没我想得那么简单:如何生成指定长度的包含所有可能的DNA序列? 我们知道当DNA序列长度为4时,4种碱基(A、T、C、G)就能组成4x4x4x4=256种可能,当DNA长度=4bp时,只需要做个ATCG的全排列就能得到这256个短片段,但当DNA长度=5bp、6bp······时呢?我们该如何得到所有可能的序列呢?
这里给大家提供一种最简单的思路,其他高级的方法欢迎大家在讨论区提出。
首先我们知道DNA序列每多1bp就会多4种可能,那么按照这样的思想,可以有以下思路
最简单的方法
也就是通过循环的方式生成所有序列,这种计算量是指数级上涨的,因此在生成长度较长的序列时会非常慢。
实现代码如下:
Random_sequence <- function(n){ #n为要生成的DNA长度
n <- n-1
ATCG<- matrix(c("A","T","C","G"),nrow=4,ncol=1)
ATCG_Initial<- matrix(c("A","T","C","G"),nrow=4,ncol=1) #每次用来叠加的固定不变的4种碱基
for(j in (1:n)){ #n位则需要做n次大循环,每次循环给前一次的结果加上ATCG四种可能
for(i in (1:dim(ATCG)[1])){
if(i==1){sequence <- matrix(NA,nrow=1,ncol=j+1)}
sequence<-rbind(sequence,cbind(matrix(rep(ATCG[i,],4),nrow=4,byrow=T),ATCG_Initial))
} #加上ATCG四种可能
ATCG <- na.omit(sequence) #去掉第一行NA
}
Sequence <- matrix(NA,nrow=nrow(ATCG),ncol=1)
for(k in (1:dim(ATCG)[1])){
Sequence[k] <- paste(as.character(ATCG[k,]), collapse = "") #之前的结果存储在矩阵中,通过paste将一行的碱基连接成一串字符
}
return(Sequence)
}
结果如下:
如生成6bp的序列
共有4096条
这种方法生成短序列是没有什么问题的,但是若是要生成10bp以上的序列就会出大问题,10bp的序列有4^10=1048576种可能,按照这种方法那就需要存储一百多万行的矩阵,建议不要轻易尝试。
网友评论