繁体   English   中英

在R中生成随机序列

[英]Generating random sequences in R

我希望生成一个随机的字母字符串(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不会正确,因为在末尾有一个TAG。 但是,序列ATGTGCTTAT可以。

有什么想法吗?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM