在R

时间:2018-10-01 15:32:21

标签: r string

我正在模拟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

一个简单的示例(无R包)

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

0 个答案:

没有答案