美文网首页R语言写不出来啊!
如何生成指定长度的DNA序列

如何生成指定长度的DNA序列

作者: 不会生信哟 | 来源:发表于2021-03-21 21:52 被阅读0次

    ——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种可能,按照这种方法那就需要存储一百多万行的矩阵,建议不要轻易尝试。

    相关文章

      网友评论

        本文标题:如何生成指定长度的DNA序列

        本文链接:https://www.haomeiwen.com/subject/kygocltx.html