我希望生成一个随机的字母字符串(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可以。
有什么想法吗?
答案 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"