如何在R中生成对象的排列或组合?

如何在R中生成对象的排列或组合?,r,combinations,permutation,multiset,r-faq,R,Combinations,Permutation,Multiset,R Faq,如何从n对象生成r对象序列?我正在寻找一种方法来进行排列或组合,有/没有替换,使用不同和非不同的项(也称为多集) 这是有关的。“不同的”解决方案可以以十二倍的方式包括在内,而“非不同的”解决方案则不包括在内。编辑:我已经更新了答案,以使用更高效的软件包 开始使用安排 包含一些用于排列和组合的高效生成器和迭代器。已经证明,安排优于大多数现有类似的包。可以找到一些基准 以下是以上问题的答案 # 1) combinations: without replacement: distinct items

如何从
n
对象生成
r
对象序列?我正在寻找一种方法来进行排列或组合,有/没有替换,使用不同和非不同的项(也称为多集)

这是有关的。“不同的”解决方案可以以十二倍的方式包括在内,而“非不同的”解决方案则不包括在内。

编辑:我已经更新了答案,以使用更高效的软件包

开始使用
安排
包含一些用于排列和组合的高效生成器和迭代器。已经证明,
安排
优于大多数现有类似的包。可以找到一些基准

以下是以上问题的答案

# 1) combinations: without replacement: distinct items

combinations(5, 2)

      [,1] [,2]
 [1,]    1    2
 [2,]    1    3
 [3,]    1    4
 [4,]    1    5
 [5,]    2    3
 [6,]    2    4
 [7,]    2    5
 [8,]    3    4
 [9,]    3    5
[10,]    4    5


# 2) combinations: with replacement: distinct items

combinations(5, 2, replace=TRUE)

      [,1] [,2]
 [1,]    1    1
 [2,]    1    2
 [3,]    1    3
 [4,]    1    4
 [5,]    1    5
 [6,]    2    2
 [7,]    2    3
 [8,]    2    4
 [9,]    2    5
[10,]    3    3
[11,]    3    4
[12,]    3    5
[13,]    4    4
[14,]    4    5
[15,]    5    5



# 3) combinations: without replacement: non distinct items

combinations(x = c("a", "b", "c"), freq = c(2, 1, 1), k = 2)

     [,1] [,2]
[1,] "a"  "a" 
[2,] "a"  "b" 
[3,] "a"  "c" 
[4,] "b"  "c" 



# 4) combinations: with replacement: non distinct items

combinations(x = c("a", "b", "c"), k = 2, replace = TRUE)  # as `freq` does not matter

     [,1] [,2]
[1,] "a"  "a" 
[2,] "a"  "b" 
[3,] "a"  "c" 
[4,] "b"  "b" 
[5,] "b"  "c" 
[6,] "c"  "c" 

# 5) permutations: without replacement: distinct items

permutations(5, 2)

      [,1] [,2]
 [1,]    1    2
 [2,]    1    3
 [3,]    1    4
 [4,]    1    5
 [5,]    2    1
 [6,]    2    3
 [7,]    2    4
 [8,]    2    5
 [9,]    3    1
[10,]    3    2
[11,]    3    4
[12,]    3    5
[13,]    4    1
[14,]    4    2
[15,]    4    3
[16,]    4    5
[17,]    5    1
[18,]    5    2
[19,]    5    3
[20,]    5    4



# 6) permutations: with replacement: distinct items

permutations(5, 2, replace = TRUE)

      [,1] [,2]
 [1,]    1    1
 [2,]    1    2
 [3,]    1    3
 [4,]    1    4
 [5,]    1    5
 [6,]    2    1
 [7,]    2    2
 [8,]    2    3
 [9,]    2    4
[10,]    2    5
[11,]    3    1
[12,]    3    2
[13,]    3    3
[14,]    3    4
[15,]    3    5
[16,]    4    1
[17,]    4    2
[18,]    4    3
[19,]    4    4
[20,]    4    5
[21,]    5    1
[22,]    5    2
[23,]    5    3
[24,]    5    4
[25,]    5    5


# 7) permutations: without replacement: non distinct items

permutations(x = c("a", "b", "c"), freq = c(2, 1, 1), k = 2)

     [,1] [,2]
[1,] "a"  "a" 
[2,] "a"  "b" 
[3,] "a"  "c" 
[4,] "b"  "a" 
[5,] "b"  "c" 
[6,] "c"  "a" 
[7,] "c"  "b" 



# 8) permutations: with replacement: non distinct items

permutations(x = c("a", "b", "c"), k = 2, replace = TRUE)  # as `freq` doesn't matter

      [,1] [,2]
 [1,] "a"  "a" 
 [2,] "a"  "b" 
 [3,] "a"  "c" 
 [4,] "b"  "a" 
 [5,] "b"  "b" 
 [6,] "b"  "c" 
 [7,] "c"  "a" 
 [8,] "c"  "b" 
 [9,] "c"  "c" 
与其他套餐相比 与现有软件包相比,使用
安排
几乎没有什么优势

  • 集成框架:您不必为不同的方法使用不同的包

  • 这是非常有效的。有关一些基准,请参见

  • 它是内存效率高,它能够生成所有13!如果排列为1到13,由于矩阵大小的限制,现有包将无法这样做。迭代器的
    getnext()
    方法允许用户逐个获得安排

  • 生成的排列按字典顺序排列,这可能是某些用户所需要的

  • 在R中浏览组合数学的一部分* 下面,我们将研究具有生成组合和置换功能的包。如果我遗漏了任何信息包,请原谅我,并请留下评论,或者更好的是,编辑这篇文章

    分析大纲:

  • 导言
  • 组合
  • 排列
  • 多集
  • 总结
  • 记忆
  • 在开始之前,我们注意到每次选择m的不同项与非不同项的组合/置换是等效的。之所以如此,是因为当我们有替代品时,它并不具体。因此,无论某个特定元素最初出现多少次,输出都会有该元素的实例重复1到m次

    1.介绍
  • gtools
    v3.8.1
  • combinat
    v0.0-8
  • multicol
    v0.1-10
  • 分区
    v1.9-19
  • RcppAlgos
    v2.0.1版(我是作者)
  • 安排
    v1.1.0
  • gRbase
    v1.8-3
  • 我没有包括
    permute
    permutations
    gRbase::aperm/ar_perm
    ,因为它们并不是真正用来解决这类问题的

    |---------------------------------------概述----------------------------------------|

    |_______________| gtools | combinat | multicool | partitions | 
    |      comb rep |  Yes   |          |           |            | 
    |   comb NO rep |  Yes   |   Yes    |           |            | 
    |      perm rep |  Yes   |          |           |            |  
    |   perm NO rep |  Yes   |   Yes    |    Yes    |    Yes     |
    | perm multiset |        |          |    Yes    |            |  
    | comb multiset |        |          |           |            |  
    |accepts factors|        |   Yes    |           |            |  
    |   m at a time |  Yes   |  Yes/No  |           |            |  
    |general vector |  Yes   |   Yes    |    Yes    |            |
    |    iterable   |        |          |    Yes    |            |
    |parallelizable |        |          |           |            |
    |  big integer  |        |          |           |            |
    
    |_______________| iterpc | arrangements | RcppAlgos | gRbase |
    |      comb rep |  Yes   |     Yes      |    Yes    |        |
    |   comb NO rep |  Yes   |     Yes      |    Yes    |  Yes   |   
    |      perm rep |  Yes   |     Yes      |    Yes    |        |
    |   perm NO rep |  Yes   |     Yes      |    Yes    |   *    |
    | perm multiset |  Yes   |     Yes      |    Yes    |        |
    | comb multiset |  Yes   |     Yes      |    Yes    |        |
    |accepts factors|        |     Yes      |    Yes    |        |
    |   m at a time |  Yes   |     Yes      |    Yes    |  Yes   |
    |general vector |  Yes   |     Yes      |    Yes    |  Yes   |
    |    iterable   |        |     Yes      | Partially |        |
    |parallelizable |        |     Yes      |    Yes    |        |
    |  big integer  |        |     Yes      |           |        |
    
    任务,
    m次
    一般向量
    ,指的是生成结果“m次”(当m小于向量长度时)和重新排列“一般向量”的能力,而不是
    1:n
    。在实践中,我们通常关心的是寻找一般向量的重新排列,因此下面的所有检查都将反映这一点(如果可能)

    所有基准测试都在3种不同的设置上运行

  • MacBookPro i7 16Gb
  • Macbook Air i5 4Gb
  • 运行Windows7 i5 8Gb的联想
  • 所列结果来自设置#1(即MBPro)。其他两个系统的结果相似。此外,
    gc()
    会定期调用,以确保所有内存可用(请参见
    ?gc

    2.组合 首先,我们一次检查没有替换选择m的组合

  • RcppAlgos
  • combinat
    (或
    utils
  • gtools
  • 安排
  • gRbase
  • 如何:

    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(13)
    testVector1 <- sort(sample(100, 17))
    m <- 9
    t1 <- comboGeneral(testVector1, m)  ## returns matrix with m columns
    t3 <- combinat::combn(testVector1, m)  ## returns matrix with m rows
    t4 <- gtools::combinations(17, m, testVector1)  ## returns matrix with m columns
    identical(t(t3), t4) ## must transpose to compare
    #> [1] TRUE
    t5 <- combinations(testVector1, m)
    identical(t1, t5)
    #> [1] TRUE
    t6 <- gRbase::combnPrim(testVector1, m)
    identical(t(t6)[do.call(order, as.data.frame(t(t6))),], t1)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(97)
    testVector2 <- sort(rnorm(10))
    m <- 8
    t1 <- comboGeneral(testVector2, m, repetition = TRUE)
    t3 <- gtools::combinations(10, m, testVector2, repeats.allowed = TRUE)
    identical(t1, t3)
    #> [1] TRUE
    ## arrangements
    t4 <- combinations(testVector2, m, replace = TRUE)
    identical(t1, t4)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(101)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    
    ## RcppAlgos... permuteGeneral same as comboGeneral above
    t1 <- permuteGeneral(testVector3, 6)
    ## gtools... permutations same as combinations above
    t3 <- gtools::permutations(10, 6, testVector3)
    identical(t1, t3)
    #> [1] TRUE
    ## arrangements
    t4 <- permutations(testVector3, 6)
    identical(t1, t4)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(89)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    testVector3Prime <- testVector3[1:7]
    ## For RcppAlgos, & gtools (see above)
    
    ## combinat
    t4 <- combinat::permn(testVector3Prime) ## returns a list of vectors
    ## convert to a matrix
    t4 <- do.call(rbind, t4)
    ## multicool.. we must first call initMC
    t5 <- multicool::allPerm(multicool::initMC(testVector3Prime)) ## returns a matrix with n columns
    all.equal(t4[do.call(order,as.data.frame(t4)),],
              t5[do.call(order,as.data.frame(t5)),])
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(89)
    t1 <- partitions::perms(7)  ## returns an object of type 'partition' with n rows
    identical(t(as.matrix(t1)), permutations(7,7))
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(34)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    t1 <- permuteGeneral(testVector3, 5, repetition = TRUE)
    t3 <- gtools::permutations(10, 5, testVector3, repeats.allowed = TRUE)
    t4 <- permutations(x = testVector3, k = 5, replace = TRUE)
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(8128)
    myFreqs <- sample(1:3, 5, replace = TRUE)
    testVector5 <- sort(runif(5))
    myFreqs
    #> [1] 2 2 2 1 3
    t1 <- permuteGeneral(testVector5, 7, freqs = myFreqs)
    t3 <- permutations(freq = myFreqs, k = 7, x = testVector5)
    identical(t1, t3)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(8128)
    myFreqs2 <- c(2,1,2,1,2)
    testVector6 <- (1:5)^3
    ## For multicool, you must have the elements explicitly repeated
    testVector6Prime <- rep(testVector6, times = myFreqs2)
    t3 <- multicool::allPerm(multicool::initMC(testVector6Prime))
    
    ## for comparison
    t1 <- permuteGeneral(testVector6, freqs = myFreqs2)
    identical(t1[do.call(order,as.data.frame(t1)),],
              t3[do.call(order,as.data.frame(t3)),])
    #> [1] TRUE
    
    现在,我们一次检查替换选择为m的组合

  • RcppAlgos
  • gtools
  • 安排
  • 如何:

    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(13)
    testVector1 <- sort(sample(100, 17))
    m <- 9
    t1 <- comboGeneral(testVector1, m)  ## returns matrix with m columns
    t3 <- combinat::combn(testVector1, m)  ## returns matrix with m rows
    t4 <- gtools::combinations(17, m, testVector1)  ## returns matrix with m columns
    identical(t(t3), t4) ## must transpose to compare
    #> [1] TRUE
    t5 <- combinations(testVector1, m)
    identical(t1, t5)
    #> [1] TRUE
    t6 <- gRbase::combnPrim(testVector1, m)
    identical(t(t6)[do.call(order, as.data.frame(t(t6))),], t1)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(97)
    testVector2 <- sort(rnorm(10))
    m <- 8
    t1 <- comboGeneral(testVector2, m, repetition = TRUE)
    t3 <- gtools::combinations(10, m, testVector2, repeats.allowed = TRUE)
    identical(t1, t3)
    #> [1] TRUE
    ## arrangements
    t4 <- combinations(testVector2, m, replace = TRUE)
    identical(t1, t4)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(101)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    
    ## RcppAlgos... permuteGeneral same as comboGeneral above
    t1 <- permuteGeneral(testVector3, 6)
    ## gtools... permutations same as combinations above
    t3 <- gtools::permutations(10, 6, testVector3)
    identical(t1, t3)
    #> [1] TRUE
    ## arrangements
    t4 <- permutations(testVector3, 6)
    identical(t1, t4)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(89)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    testVector3Prime <- testVector3[1:7]
    ## For RcppAlgos, & gtools (see above)
    
    ## combinat
    t4 <- combinat::permn(testVector3Prime) ## returns a list of vectors
    ## convert to a matrix
    t4 <- do.call(rbind, t4)
    ## multicool.. we must first call initMC
    t5 <- multicool::allPerm(multicool::initMC(testVector3Prime)) ## returns a matrix with n columns
    all.equal(t4[do.call(order,as.data.frame(t4)),],
              t5[do.call(order,as.data.frame(t5)),])
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(89)
    t1 <- partitions::perms(7)  ## returns an object of type 'partition' with n rows
    identical(t(as.matrix(t1)), permutations(7,7))
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(34)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    t1 <- permuteGeneral(testVector3, 5, repetition = TRUE)
    t3 <- gtools::permutations(10, 5, testVector3, repeats.allowed = TRUE)
    t4 <- permutations(x = testVector3, k = 5, replace = TRUE)
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(8128)
    myFreqs <- sample(1:3, 5, replace = TRUE)
    testVector5 <- sort(runif(5))
    myFreqs
    #> [1] 2 2 2 1 3
    t1 <- permuteGeneral(testVector5, 7, freqs = myFreqs)
    t3 <- permutations(freq = myFreqs, k = 7, x = testVector5)
    identical(t1, t3)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(8128)
    myFreqs2 <- c(2,1,2,1,2)
    testVector6 <- (1:5)^3
    ## For multicool, you must have the elements explicitly repeated
    testVector6Prime <- rep(testVector6, times = myFreqs2)
    t3 <- multicool::allPerm(multicool::initMC(testVector6Prime))
    
    ## for comparison
    t1 <- permuteGeneral(testVector6, freqs = myFreqs2)
    identical(t1[do.call(order,as.data.frame(t1)),],
              t3[do.call(order,as.data.frame(t3)),])
    #> [1] TRUE
    
    3.排列 首先,我们一次检查没有替换选择m的置换

  • RcppAlgos
  • gtools
  • 安排
  • 如何:

    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(13)
    testVector1 <- sort(sample(100, 17))
    m <- 9
    t1 <- comboGeneral(testVector1, m)  ## returns matrix with m columns
    t3 <- combinat::combn(testVector1, m)  ## returns matrix with m rows
    t4 <- gtools::combinations(17, m, testVector1)  ## returns matrix with m columns
    identical(t(t3), t4) ## must transpose to compare
    #> [1] TRUE
    t5 <- combinations(testVector1, m)
    identical(t1, t5)
    #> [1] TRUE
    t6 <- gRbase::combnPrim(testVector1, m)
    identical(t(t6)[do.call(order, as.data.frame(t(t6))),], t1)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(97)
    testVector2 <- sort(rnorm(10))
    m <- 8
    t1 <- comboGeneral(testVector2, m, repetition = TRUE)
    t3 <- gtools::combinations(10, m, testVector2, repeats.allowed = TRUE)
    identical(t1, t3)
    #> [1] TRUE
    ## arrangements
    t4 <- combinations(testVector2, m, replace = TRUE)
    identical(t1, t4)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(101)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    
    ## RcppAlgos... permuteGeneral same as comboGeneral above
    t1 <- permuteGeneral(testVector3, 6)
    ## gtools... permutations same as combinations above
    t3 <- gtools::permutations(10, 6, testVector3)
    identical(t1, t3)
    #> [1] TRUE
    ## arrangements
    t4 <- permutations(testVector3, 6)
    identical(t1, t4)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(89)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    testVector3Prime <- testVector3[1:7]
    ## For RcppAlgos, & gtools (see above)
    
    ## combinat
    t4 <- combinat::permn(testVector3Prime) ## returns a list of vectors
    ## convert to a matrix
    t4 <- do.call(rbind, t4)
    ## multicool.. we must first call initMC
    t5 <- multicool::allPerm(multicool::initMC(testVector3Prime)) ## returns a matrix with n columns
    all.equal(t4[do.call(order,as.data.frame(t4)),],
              t5[do.call(order,as.data.frame(t5)),])
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(89)
    t1 <- partitions::perms(7)  ## returns an object of type 'partition' with n rows
    identical(t(as.matrix(t1)), permutations(7,7))
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(34)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    t1 <- permuteGeneral(testVector3, 5, repetition = TRUE)
    t3 <- gtools::permutations(10, 5, testVector3, repeats.allowed = TRUE)
    t4 <- permutations(x = testVector3, k = 5, replace = TRUE)
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(8128)
    myFreqs <- sample(1:3, 5, replace = TRUE)
    testVector5 <- sort(runif(5))
    myFreqs
    #> [1] 2 2 2 1 3
    t1 <- permuteGeneral(testVector5, 7, freqs = myFreqs)
    t3 <- permutations(freq = myFreqs, k = 7, x = testVector5)
    identical(t1, t3)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(8128)
    myFreqs2 <- c(2,1,2,1,2)
    testVector6 <- (1:5)^3
    ## For multicool, you must have the elements explicitly repeated
    testVector6Prime <- rep(testVector6, times = myFreqs2)
    t3 <- multicool::allPerm(multicool::initMC(testVector6Prime))
    
    ## for comparison
    t1 <- permuteGeneral(testVector6, freqs = myFreqs2)
    identical(t1[do.call(order,as.data.frame(t1)),],
              t3[do.call(order,as.data.frame(t3)),])
    #> [1] TRUE
    
    接下来,我们在不使用一般向量替换的情况下检查置换(返回所有置换)

  • RcppAlgos
  • gtools
  • combinat
  • multicol
  • 安排
  • 如何:

    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(13)
    testVector1 <- sort(sample(100, 17))
    m <- 9
    t1 <- comboGeneral(testVector1, m)  ## returns matrix with m columns
    t3 <- combinat::combn(testVector1, m)  ## returns matrix with m rows
    t4 <- gtools::combinations(17, m, testVector1)  ## returns matrix with m columns
    identical(t(t3), t4) ## must transpose to compare
    #> [1] TRUE
    t5 <- combinations(testVector1, m)
    identical(t1, t5)
    #> [1] TRUE
    t6 <- gRbase::combnPrim(testVector1, m)
    identical(t(t6)[do.call(order, as.data.frame(t(t6))),], t1)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(97)
    testVector2 <- sort(rnorm(10))
    m <- 8
    t1 <- comboGeneral(testVector2, m, repetition = TRUE)
    t3 <- gtools::combinations(10, m, testVector2, repeats.allowed = TRUE)
    identical(t1, t3)
    #> [1] TRUE
    ## arrangements
    t4 <- combinations(testVector2, m, replace = TRUE)
    identical(t1, t4)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(101)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    
    ## RcppAlgos... permuteGeneral same as comboGeneral above
    t1 <- permuteGeneral(testVector3, 6)
    ## gtools... permutations same as combinations above
    t3 <- gtools::permutations(10, 6, testVector3)
    identical(t1, t3)
    #> [1] TRUE
    ## arrangements
    t4 <- permutations(testVector3, 6)
    identical(t1, t4)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(89)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    testVector3Prime <- testVector3[1:7]
    ## For RcppAlgos, & gtools (see above)
    
    ## combinat
    t4 <- combinat::permn(testVector3Prime) ## returns a list of vectors
    ## convert to a matrix
    t4 <- do.call(rbind, t4)
    ## multicool.. we must first call initMC
    t5 <- multicool::allPerm(multicool::initMC(testVector3Prime)) ## returns a matrix with n columns
    all.equal(t4[do.call(order,as.data.frame(t4)),],
              t5[do.call(order,as.data.frame(t5)),])
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(89)
    t1 <- partitions::perms(7)  ## returns an object of type 'partition' with n rows
    identical(t(as.matrix(t1)), permutations(7,7))
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(34)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    t1 <- permuteGeneral(testVector3, 5, repetition = TRUE)
    t3 <- gtools::permutations(10, 5, testVector3, repeats.allowed = TRUE)
    t4 <- permutations(x = testVector3, k = 5, replace = TRUE)
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(8128)
    myFreqs <- sample(1:3, 5, replace = TRUE)
    testVector5 <- sort(runif(5))
    myFreqs
    #> [1] 2 2 2 1 3
    t1 <- permuteGeneral(testVector5, 7, freqs = myFreqs)
    t3 <- permutations(freq = myFreqs, k = 7, x = testVector5)
    identical(t1, t3)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(8128)
    myFreqs2 <- c(2,1,2,1,2)
    testVector6 <- (1:5)^3
    ## For multicool, you must have the elements explicitly repeated
    testVector6Prime <- rep(testVector6, times = myFreqs2)
    t3 <- multicool::allPerm(multicool::initMC(testVector6Prime))
    
    ## for comparison
    t1 <- permuteGeneral(testVector6, freqs = myFreqs2)
    identical(t1[do.call(order,as.data.frame(t1)),],
              t3[do.call(order,as.data.frame(t3)),])
    #> [1] TRUE
    
    现在,我们检查置换,而不替换
    1:n
    (返回所有置换)

  • RcppAlgos
  • gtools
  • combinat
  • multicol
  • 分区
  • 安排
  • 如何:

    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(13)
    testVector1 <- sort(sample(100, 17))
    m <- 9
    t1 <- comboGeneral(testVector1, m)  ## returns matrix with m columns
    t3 <- combinat::combn(testVector1, m)  ## returns matrix with m rows
    t4 <- gtools::combinations(17, m, testVector1)  ## returns matrix with m columns
    identical(t(t3), t4) ## must transpose to compare
    #> [1] TRUE
    t5 <- combinations(testVector1, m)
    identical(t1, t5)
    #> [1] TRUE
    t6 <- gRbase::combnPrim(testVector1, m)
    identical(t(t6)[do.call(order, as.data.frame(t(t6))),], t1)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(97)
    testVector2 <- sort(rnorm(10))
    m <- 8
    t1 <- comboGeneral(testVector2, m, repetition = TRUE)
    t3 <- gtools::combinations(10, m, testVector2, repeats.allowed = TRUE)
    identical(t1, t3)
    #> [1] TRUE
    ## arrangements
    t4 <- combinations(testVector2, m, replace = TRUE)
    identical(t1, t4)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(101)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    
    ## RcppAlgos... permuteGeneral same as comboGeneral above
    t1 <- permuteGeneral(testVector3, 6)
    ## gtools... permutations same as combinations above
    t3 <- gtools::permutations(10, 6, testVector3)
    identical(t1, t3)
    #> [1] TRUE
    ## arrangements
    t4 <- permutations(testVector3, 6)
    identical(t1, t4)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(89)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    testVector3Prime <- testVector3[1:7]
    ## For RcppAlgos, & gtools (see above)
    
    ## combinat
    t4 <- combinat::permn(testVector3Prime) ## returns a list of vectors
    ## convert to a matrix
    t4 <- do.call(rbind, t4)
    ## multicool.. we must first call initMC
    t5 <- multicool::allPerm(multicool::initMC(testVector3Prime)) ## returns a matrix with n columns
    all.equal(t4[do.call(order,as.data.frame(t4)),],
              t5[do.call(order,as.data.frame(t5)),])
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(89)
    t1 <- partitions::perms(7)  ## returns an object of type 'partition' with n rows
    identical(t(as.matrix(t1)), permutations(7,7))
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(34)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    t1 <- permuteGeneral(testVector3, 5, repetition = TRUE)
    t3 <- gtools::permutations(10, 5, testVector3, repeats.allowed = TRUE)
    t4 <- permutations(x = testVector3, k = 5, replace = TRUE)
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(8128)
    myFreqs <- sample(1:3, 5, replace = TRUE)
    testVector5 <- sort(runif(5))
    myFreqs
    #> [1] 2 2 2 1 3
    t1 <- permuteGeneral(testVector5, 7, freqs = myFreqs)
    t3 <- permutations(freq = myFreqs, k = 7, x = testVector5)
    identical(t1, t3)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(8128)
    myFreqs2 <- c(2,1,2,1,2)
    testVector6 <- (1:5)^3
    ## For multicool, you must have the elements explicitly repeated
    testVector6Prime <- rep(testVector6, times = myFreqs2)
    t3 <- multicool::allPerm(multicool::initMC(testVector6Prime))
    
    ## for comparison
    t1 <- permuteGeneral(testVector6, freqs = myFreqs2)
    identical(t1[do.call(order,as.data.frame(t1)),],
              t3[do.call(order,as.data.frame(t3)),])
    #> [1] TRUE
    
    最后,我们检查置换

  • RcppAlgos
  • iterpc
  • gtools
  • 安排
  • 如何:

    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(13)
    testVector1 <- sort(sample(100, 17))
    m <- 9
    t1 <- comboGeneral(testVector1, m)  ## returns matrix with m columns
    t3 <- combinat::combn(testVector1, m)  ## returns matrix with m rows
    t4 <- gtools::combinations(17, m, testVector1)  ## returns matrix with m columns
    identical(t(t3), t4) ## must transpose to compare
    #> [1] TRUE
    t5 <- combinations(testVector1, m)
    identical(t1, t5)
    #> [1] TRUE
    t6 <- gRbase::combnPrim(testVector1, m)
    identical(t(t6)[do.call(order, as.data.frame(t(t6))),], t1)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(97)
    testVector2 <- sort(rnorm(10))
    m <- 8
    t1 <- comboGeneral(testVector2, m, repetition = TRUE)
    t3 <- gtools::combinations(10, m, testVector2, repeats.allowed = TRUE)
    identical(t1, t3)
    #> [1] TRUE
    ## arrangements
    t4 <- combinations(testVector2, m, replace = TRUE)
    identical(t1, t4)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(101)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    
    ## RcppAlgos... permuteGeneral same as comboGeneral above
    t1 <- permuteGeneral(testVector3, 6)
    ## gtools... permutations same as combinations above
    t3 <- gtools::permutations(10, 6, testVector3)
    identical(t1, t3)
    #> [1] TRUE
    ## arrangements
    t4 <- permutations(testVector3, 6)
    identical(t1, t4)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(89)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    testVector3Prime <- testVector3[1:7]
    ## For RcppAlgos, & gtools (see above)
    
    ## combinat
    t4 <- combinat::permn(testVector3Prime) ## returns a list of vectors
    ## convert to a matrix
    t4 <- do.call(rbind, t4)
    ## multicool.. we must first call initMC
    t5 <- multicool::allPerm(multicool::initMC(testVector3Prime)) ## returns a matrix with n columns
    all.equal(t4[do.call(order,as.data.frame(t4)),],
              t5[do.call(order,as.data.frame(t5)),])
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(89)
    t1 <- partitions::perms(7)  ## returns an object of type 'partition' with n rows
    identical(t(as.matrix(t1)), permutations(7,7))
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(34)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    t1 <- permuteGeneral(testVector3, 5, repetition = TRUE)
    t3 <- gtools::permutations(10, 5, testVector3, repeats.allowed = TRUE)
    t4 <- permutations(x = testVector3, k = 5, replace = TRUE)
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(8128)
    myFreqs <- sample(1:3, 5, replace = TRUE)
    testVector5 <- sort(runif(5))
    myFreqs
    #> [1] 2 2 2 1 3
    t1 <- permuteGeneral(testVector5, 7, freqs = myFreqs)
    t3 <- permutations(freq = myFreqs, k = 7, x = testVector5)
    identical(t1, t3)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(8128)
    myFreqs2 <- c(2,1,2,1,2)
    testVector6 <- (1:5)^3
    ## For multicool, you must have the elements explicitly repeated
    testVector6Prime <- rep(testVector6, times = myFreqs2)
    t3 <- multicool::allPerm(multicool::initMC(testVector6Prime))
    
    ## for comparison
    t1 <- permuteGeneral(testVector6, freqs = myFreqs2)
    identical(t1[do.call(order,as.data.frame(t1)),],
              t3[do.call(order,as.data.frame(t3)),])
    #> [1] TRUE
    
    那不是打字错误
    gtools::permutations
    几乎与其他编译函数一样快。我鼓励读者去查看
    gtools::permutations
    的源代码,因为它是最优雅的编程展示之一(
    R
    或其他)

    4.多集 首先,我们检查多集的组合

  • RcppAlgos
  • 安排
  • 要查找多集的组合/排列,请使用
    RcppAlgos
    使用
    freqs
    参数指定源向量的每个元素
    v
    重复的次数

    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(496)
    myFreqs <- sample(1:5, 10, replace = TRUE)
    ## This is how many times each element will be repeated
    myFreqs
    #>  [1] 2 4 4 5 3 2 2 2 3 4
    testVector4 <- as.integer(c(1, 2, 3, 5, 8, 13, 21, 34, 55, 89))
    t1 <- comboGeneral(testVector4, 12, freqs = myFreqs)
    t3 <- combinations(freq = myFreqs, k = 12, x = testVector4)
    identical(t1, t3)
    #> [1] TRUE
    
    对于一次选择m的多集排列,我们有:

  • RcppAlgos
  • 安排
  • 如何:

    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(13)
    testVector1 <- sort(sample(100, 17))
    m <- 9
    t1 <- comboGeneral(testVector1, m)  ## returns matrix with m columns
    t3 <- combinat::combn(testVector1, m)  ## returns matrix with m rows
    t4 <- gtools::combinations(17, m, testVector1)  ## returns matrix with m columns
    identical(t(t3), t4) ## must transpose to compare
    #> [1] TRUE
    t5 <- combinations(testVector1, m)
    identical(t1, t5)
    #> [1] TRUE
    t6 <- gRbase::combnPrim(testVector1, m)
    identical(t(t6)[do.call(order, as.data.frame(t(t6))),], t1)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(97)
    testVector2 <- sort(rnorm(10))
    m <- 8
    t1 <- comboGeneral(testVector2, m, repetition = TRUE)
    t3 <- gtools::combinations(10, m, testVector2, repeats.allowed = TRUE)
    identical(t1, t3)
    #> [1] TRUE
    ## arrangements
    t4 <- combinations(testVector2, m, replace = TRUE)
    identical(t1, t4)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(101)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    
    ## RcppAlgos... permuteGeneral same as comboGeneral above
    t1 <- permuteGeneral(testVector3, 6)
    ## gtools... permutations same as combinations above
    t3 <- gtools::permutations(10, 6, testVector3)
    identical(t1, t3)
    #> [1] TRUE
    ## arrangements
    t4 <- permutations(testVector3, 6)
    identical(t1, t4)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(89)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    testVector3Prime <- testVector3[1:7]
    ## For RcppAlgos, & gtools (see above)
    
    ## combinat
    t4 <- combinat::permn(testVector3Prime) ## returns a list of vectors
    ## convert to a matrix
    t4 <- do.call(rbind, t4)
    ## multicool.. we must first call initMC
    t5 <- multicool::allPerm(multicool::initMC(testVector3Prime)) ## returns a matrix with n columns
    all.equal(t4[do.call(order,as.data.frame(t4)),],
              t5[do.call(order,as.data.frame(t5)),])
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(89)
    t1 <- partitions::perms(7)  ## returns an object of type 'partition' with n rows
    identical(t(as.matrix(t1)), permutations(7,7))
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(34)
    testVector3 <- as.integer(c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29))
    t1 <- permuteGeneral(testVector3, 5, repetition = TRUE)
    t3 <- gtools::permutations(10, 5, testVector3, repeats.allowed = TRUE)
    t4 <- permutations(x = testVector3, k = 5, replace = TRUE)
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(8128)
    myFreqs <- sample(1:3, 5, replace = TRUE)
    testVector5 <- sort(runif(5))
    myFreqs
    #> [1] 2 2 2 1 3
    t1 <- permuteGeneral(testVector5, 7, freqs = myFreqs)
    t3 <- permutations(freq = myFreqs, k = 7, x = testVector5)
    identical(t1, t3)
    #> [1] TRUE
    
    library(RcppAlgos)
    library(arrangements)
    library(microbenchmark)
    options(digits = 4)
    set.seed(8128)
    myFreqs2 <- c(2,1,2,1,2)
    testVector6 <- (1:5)^3
    ## For multicool, you must have the elements explicitly repeated
    testVector6Prime <- rep(testVector6, times = myFreqs2)
    t3 <- multicool::allPerm(multicool::initMC(testVector6Prime))
    
    ## for comparison
    t1 <- permuteGeneral(testVector6, freqs = myFreqs2)
    identical(t1[do.call(order,as.data.frame(t1)),],
              t3[do.call(order,as.data.frame(t3)),])
    #> [1] TRUE
    
    关于m的置换