n个数字的所有组合

时间:2014-06-06 14:02:34

标签: r combinations

我想生成n个数字的所有唯一组合而无需替换。例如,如果n = 4,则此处显示gamma(4+1)个组合:

combos4 <- read.table(text='

        x1  x2  x3  x4
         1   2   3   4
         1   2   4   3
         1   3   2   4
         1   3   4   2
         1   4   2   3
         1   4   3   2

         2   1   3   4
         2   1   4   3
         2   3   1   4
         2   3   4   1
         2   4   1   3
         2   4   3   1

         3   1   2   4
         3   1   4   2
         3   2   1   4
         3   2   4   1
         3   4   1   2
         3   4   2   1

         4   1   2   3
         4   1   3   2
         4   2   1   3
         4   2   3   1
         4   3   1   2
         4   3   2   1

', header = TRUE)

我可以使用以下代码获得这24种组合:

combos <- expand.grid(x1=1:4, x2=1:4, x3=1:4, x4=1:4)

my.combos <- combos[apply(combos,1,function(x) length(unique(x)) == ncol(combos)),]
my.combos

但是,我一直认为基础R有一种更简单的方法。具体来说,我总是假设函数combn()可以返回这些组合。但是,如果combn()我现在可以意识到我不知道该怎么做。

expand.grid方法似乎效率不高,尤其是当n很大时。

在搜索互联网和StackOverflow时,我发现了几个使用algorithm标签的类似问题,答案中提供的代码(如果提供)并不简单。很抱歉,如果这是重复的,或者我遗漏了一些明显的东西。

3 个答案:

答案 0 :(得分:3)

gtools有一个permutations函数可能会有所帮助:

library(gtools)
permutations(4,4,1:4)
##       [,1] [,2] [,3] [,4]
##  [1,]    1    2    3    4
##  [2,]    1    2    4    3
##  [3,]    1    3    2    4
##  [4,]    1    3    4    2
##  [5,]    1    4    2    3
##  [6,]    1    4    3    2
##  [7,]    2    1    3    4
##  [8,]    2    1    4    3
##  [9,]    2    3    1    4
## [10,]    2    3    4    1
## [11,]    2    4    1    3
## [12,]    2    4    3    1
## [13,]    3    1    2    4
## [14,]    3    1    4    2
## [15,]    3    2    1    4
## [16,]    3    2    4    1
## [17,]    3    4    1    2
## [18,]    3    4    2    1
## [19,]    4    1    2    3
## [20,]    4    1    3    2
## [21,]    4    2    1    3
## [22,]    4    2    3    1
## [23,]    4    3    1    2
## [24,]    4    3    2    1

并且跑得很快:

   user  system elapsed 
  0.001   0.000   0.000 

答案 1 :(得分:3)

combinat包具有permn功能

library(combinat)
permn(1:4)

> permn(1:4)
[[1]]
[1] 1 2 3 4

[[2]]
[1] 1 2 4 3

[[3]]
[1] 1 4 2 3

[[4]]
[1] 4 1 2 3

[[5]]
[1] 4 1 3 2

[[6]]
[1] 1 4 3 2

[[7]]
[1] 1 3 4 2

[[8]]
[1] 1 3 2 4

[[9]]
[1] 3 1 2 4

[[10]]
[1] 3 1 4 2

[[11]]
[1] 3 4 1 2

[[12]]
[1] 4 3 1 2

[[13]]
[1] 4 3 2 1

[[14]]
[1] 3 4 2 1

[[15]]
[1] 3 2 4 1

[[16]]
[1] 3 2 1 4

[[17]]
[1] 2 3 1 4

[[18]]
[1] 2 3 4 1

[[19]]
[1] 2 4 3 1

[[20]]
[1] 4 2 3 1

[[21]]
[1] 4 2 1 3

[[22]]
[1] 2 4 1 3

[[23]]
[1] 2 1 4 3

[[24]]
[1] 2 1 3 4

答案 2 :(得分:2)

还有iterpc个包。

> I = iterpc(4, ordered=TRUE)
> getall(I)
      [,1] [,2] [,3] [,4]
 [1,]    1    2    3    4
 [2,]    1    2    4    3
 [3,]    1    3    2    4
 [4,]    1    3    4    2
 [5,]    1    4    2    3
 [6,]    1    4    3    2
 [7,]    2    1    3    4
 [8,]    2    1    4    3
 [9,]    2    3    1    4
[10,]    2    3    4    1
...

您也可以迭代地执行此操作

> getnext(I)
[1] 1 2 3 4
> getnext(I)
[1] 1 2 4 3
> getnext(I)
[1] 1 3 2 4
> getnext(I)
[1] 1 3 4 2