在R中生成随机序列

时间:2018-08-05 18:20:09

标签: r sequence

我希望生成一个随机的字母字符串(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”的随机字符串的最简单方法是什么?

为说明起见,由于末尾有一个TAG,因此序列ATGTGCTTAG不会正确。但是序列ATGTGCTTAT可以。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用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=""))

答案 1 :(得分:0)

这是生成此类序列的简单函数。 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"