如何获得一组字母的所有可能组合

时间:2015-02-22 19:56:55

标签: r

我想创建长度为10的集合S = { a, t, g, c }的所有可能组合。因此,将有4^10 = 2^20 = 1048576个方法来执行此操作。

我正在寻找R的解决方案。我的googlefu产生了gregmisc包,但由于我的R版本,我无法安装此包。

package ‘gregmisc’ is not available (for R version 3.1.2)

更新:作为标记答案的替代方案,我还提出了来自gtools的双线解决方案。请参阅下面的答案。

4 个答案:

答案 0 :(得分:3)

我很确定这是重复但是

S <- c( "a", "t", "g", "c")
dd <- do.call(expand.grid,replicate(10,S,simplify=FALSE))

确实解决了这个问题。

答案 1 :(得分:1)

更新:作为标记答案的替代方案,我还想出了一个来自gtools的双线解决方案

library(gtools)
library(stringr)

get_dna_combinations <- function(lengthofsegment = 10){
## this function gets all possible combinations of the given length.
  x = permutations(n = 4, r = lengthofsegment, c('a', 't', 'c', 'g'), repeats.allowed=T)  
  ax = apply(x, 1, function(a) str_join(a, collapse=''))
  return(ax)
}

答案 2 :(得分:1)

您也可以使用mkAllStrings

library(Biostrings)
mkAllStrings(c("A", "C", "G", "T"), 10)

答案 3 :(得分:0)

对于更长的字符串,可能存在批次组合,因此如果它成为内存问题,这里有一个生成单个序列的函数(您可以{{1}当然):

Vectorize()

这将返回一个值矩阵(i的每个元素一列)

fun <- function(i, # the index of the sequence you wnat
                n, # the lengt of the sequence you want
                s){# the set of elements that make up a squence
    if(i > length(s)^n - 1)
        stop(sprintf('parameter "i" should be in the range [0,%s].',length(s)^n - 1))
    s[(i %/% length(s)^(seq(0,n-1))) %% length(s) + 1]
}

你可以通过以下方式获得叮咬:

FUN <- Vectorize(fun,'i')

values <- FUN(1:10,
              5,
              c('a','t','g','c'))