代码之家  ›  专栏  ›  技术社区  ›  compbiostats

在R中生成随机序列

  •  1
  • compbiostats  · 技术社区  · 8 年前

    我希望生成一个随机的字母串(a,c,g,t)。我用下面几行R代码来实现这一点:

    nucl <- letters[c(1, 3, 7, 20)] # generate letters
    
    length.seqs <- 10
    
    res <- sample(nucl, size = length.seqs, replace = TRUE) # sample with replacement to generate sequence 
    

    但是,我不希望在最后的序列中有字符串“taa”、“tag”和“tga”的连续运行。注意,这些子串中的字母顺序很重要。例如,子字符串“atg”在最后的序列中是可以的,但是“tag”不是可以的。

    生成给定长度(length.seqs)的随机字符串而不使用子字符串“taa”、“tag”、“tga”的最简单方法是什么?

    为了说明这一点,ATGTGCTTAG的序列将不正常,因为末尾有一个标记。不过,gtgcttat的序列是可以的。

    有什么想法吗?

    2 回复  |  直到 8 年前
        1
  •  0
  •   jay.sf    8 年前

    你可以用 grep() .

    M1 <- M[- c(grep("taa", M), grep("tag", M), grep("tga", M))]
    

    或者,稍微好一点

    M1 <- M[- grep(paste(c("taa", "tag", "tga"), collapse="|"), M)]
    

    结果

    > head(M1)
    [1] "ttctgggagg" "cgtccttacg" "ccatcttgtg" "aaacagacga" "gaattgcggg" "gaacttggga"
    

    数据

    set.seed(42)
    nucl <- c("a", "c", "g", "t")
    n <- 1e5
    length.seqs <- 10
    M <- replicate(n, paste0(sample(nucl, length.seqs, replace = TRUE), collapse=""))
    
        2
  •  0
  •   Warren Weckesser    8 年前

    这里有一个简单的函数来生成这样的序列。R大师可能会找到提高效率的方法。(函数假设 seqlen 至少是3。)

    generate <- function(seqlen) {
    
        choices <- c('a', 'c', 'g', 't')
        choices.ta <- c('c', 't')
        choices.tg <- c('c', 'g', 't')
    
        vec <- vector("list", seqlen)
        vec[1:2] <- sample(choices, size=2, replace=TRUE)
    
        for (i in 3:seqlen) {
            if ((vec[i-2] == 't') && (vec[i-1] == 'a')) {
                vec[i] <- sample(choices.ta, size=1)
            }
            else if ((vec[i-2] == 't') && (vec[i-1] == 'g')) {
                vec[i] <- sample(choices.tg, size=1)
            }
            else {
                vec[i] <- sample(choices, size=1)
            }
        }
    
        # Collapse vec to a string.
        res <- paste(vec, collapse='')
        return(res)
    }
    

    例如,

    > generate(10)
    [1] "gtatcggcgg"
    > generate(100)
    [1] "aagcaactctaccgagattcatcttacgatggacggggtttccctacatcacttggggcactcgggctggcgcacatggatggcggtgcgtccaaattgc"
    > generate(100)
    [1] "tgtttcgcacctacaagcatttctatacttcgaatatatcaaaagagtgggcgtcctgcccgaccatcggccctcgtggctgggctttcactgcaaagga"
    
    推荐文章