我正在模拟R中的一些随机DNA字符串(序列)。这些序列由字母A,C,G和T组成。
在此类序列的数据集中,某些序列可能相同(重复)。
假设我有100个这样的序列,可以分为5个唯一的集合。
我现在拥有的工作代码(如下所示)将输出类似
Unique groups: 1 2 3 4 5
Number of Sequences: 96 1 1 1 1
但是,我希望发行版类似于
Unique groups: 1 2 3 4 5
Number of Sequences: 56 24 10 5 5
这可以通过将第1组中的某些序列(96个序列)随机分配给仅包含一个序列的所有其他组来实现。
我的序列存储在名为“ res”的变量中。
下面的代码并不能完全满足我的要求。
res <- res[sample(unique(nrow(res)), size = nrow(res), replace = TRUE), ]
在上面的代码中,“大小”是数据集中DNA序列的数量。
如何更改上面的代码以完成我所需要的?
注意:一个人不知道将先验生成的唯一集的数量,因此在样本中使用'probs'参数是不够的。
library(pegas)
num.seqs <- 100 # number of DNA sequences to generate
length.seqs <- 500 # length of DNA sequences
mu.rate <- 1e-4 # mutation rate
set.seed(1234) # for reproducibility
nucl <- as.DNAbin(c('a','c','g','t')) # DNA alphabet
res <- sample(nucl, size = length.seqs, replace = TRUE, prob = rep(0.25, 4)) # generate a random DNA sequence
mu.set <- list('a' = as.DNAbin('c'),
'a' = as.DNAbin('g'),
'a' = as.DNAbin('t'),
'c' = as.DNAbin('a'),
'c' = as.DNAbin('g'),
'c' = as.DNAbin('t'),
'g' = as.DNAbin('a'),
'g' = as.DNAbin('c'),
'g' = as.DNAbin('t'),
't' = as.DNAbin('a'),
't' = as.DNAbin('c'),
't' = as.DNAbin('g'))
muts <- function(res) {
unlist(mu.set[as.character(res)])
}
duplicate.seq <- function(res) { # duplicate sequrnce
num.muts <- rbinom(n = 1, size = length.seqs, prob = mu.rate) # add random mutations
if (num.muts > 0) {
idx <- sample(length.seqs, size = num.muts, replace = FALSE)
res[idx] <- muts(res[idx])
}
res
}
res <- matrix(replicate(num.seqs, duplicate.seq(res)), byrow = TRUE, nrow = num.seqs) # generate num.seqs sequences
class(res) <- "DNAbin"
h <- sort(haplotype(res), decreasing = TRUE, what = "frequencies") # distribution of unique groups
rownames(h) <- 1:nrow(h)
h # print distribution
num.seqs <- 10
length.seqs <- 10
lets <- letters[c(1, 3, 7, 20)] # DNA alphabet
lets
res <- t(replicate(num.seqs, sample(lets, length.seqs, replace = TRUE))) # generate sequences
res <- res[sample(nrow(res), size = nrow(res), replace = TRUE), ] # duplicate some sequences