函数来计算R中重复的置换

函数来计算R中重复的置换,r,algorithm,permutation,R,Algorithm,Permutation,我想生成向量的所有可能排列 c(1,2,2,3,3) 在R中,我使用了以下代码: library(combinat) permn(c(1,2,2,3,3)) 但是,此函数生成5=120个排列,因为它区分了两个2和两个3。它应该会生成5/(2!*2!)=30种组合 这个问题通过使用 unique(permn(c(1,2,2,3,3))) 但是,我想要一个函数,它给出 unique(permn(c(1,2,2,3,3))) 直接地,在单个函数中,不首先通过 permn(c(1,2,2,3,3

我想生成向量的所有可能排列

c(1,2,2,3,3)
在R中,我使用了以下代码:

library(combinat)
permn(c(1,2,2,3,3))
但是,此函数生成5=120个排列,因为它区分了两个2和两个3。它应该会生成5/(2!*2!)=30种组合

这个问题通过使用

unique(permn(c(1,2,2,3,3)))
但是,我想要一个函数,它给出

unique(permn(c(1,2,2,3,3)))
直接地,在单个函数中,不首先通过

permn(c(1,2,2,3,3))

您可以使用
iterpc
包获取它们

> x <- c(1, 2, 2, 3, 3)
> I <- iterpc(table(x), ordered=TRUE)
> getall(I)
      [,1] [,2] [,3] [,4] [,5]
 [1,]    1    2    2    3    3
 [2,]    1    2    3    2    3
 [3,]    1    2    3    3    2
 [4,]    1    3    2    2    3
 [5,]    1    3    2    3    2
 [6,]    1    3    3    2    2
 [7,]    2    1    2    3    3
 [8,]    2    1    3    2    3
 [9,]    2    1    3    3    2
[10,]    2    2    1    3    3
[11,]    2    2    3    1    3
[12,]    2    2    3    3    1
[13,]    2    3    1    2    3
[14,]    2    3    1    3    2
[15,]    2    3    2    1    3
[16,]    2    3    2    3    1
[17,]    2    3    3    1    2
[18,]    2    3    3    2    1
[19,]    3    1    2    2    3
[20,]    3    1    2    3    2
[21,]    3    1    3    2    2
[22,]    3    2    1    2    3
[23,]    3    2    1    3    2
[24,]    3    2    2    1    3
[25,]    3    2    2    3    1
[26,]    3    2    3    1    2
[27,]    3    2    3    2    1
[28,]    3    3    1    2    2
[29,]    3    3    2    1    2
[30,]    3    3    2    2    1
>xigetall(I)
[,1] [,2] [,3] [,4] [,5]
[1,]    1    2    2    3    3
[2,]    1    2    3    2    3
[3,]    1    2    3    3    2
[4,]    1    3    2    2    3
[5,]    1    3    2    3    2
[6,]    1    3    3    2    2
[7,]    2    1    2    3    3
[8,]    2    1    3    2    3
[9,]    2    1    3    3    2
[10,]    2    2    1    3    3
[11,]    2    2    3    1    3
[12,]    2    2    3    3    1
[13,]    2    3    1    2    3
[14,]    2    3    1    3    2
[15,]    2    3    2    1    3
[16,]    2    3    2    3    1
[17,]    2    3    3    1    2
[18,]    2    3    3    2    1
[19,]    3    1    2    2    3
[20,]    3    1    2    3    2
[21,]    3    1    3    2    2
[22,]    3    2    1    2    3
[23,]    3    2    1    3    2
[24,]    3    2    2    1    3
[25,]    3    2    2    3    1
[26,]    3    2    3    1    2
[27,]    3    2    3    2    1
[28,]    3    3    1    2    2
[29,]    3    3    2    1    2
[30,]    3    3    2    2    1

即使在
combinat
permute
软件包中,似乎也没有什么东西符合这一要求。这可能非常不寻常,您需要自己编写代码。我能找到的最好的名字是“用重迭排列”,我认为有些答案是C++的,所以用<代码> RCPP < /代码>很容易把它们移植过来。祝你好运不幸的是,“重复排列”被用来描述矛盾的事物。例如,如果您想使用数字0到9生成所有可能的三位数,您将生成重复排列,并获得1000个。但是,如果给你一个数字列表,其中一些是重复的,那么“重复排列”意味着不将重复的数字视为唯一的。例如,请参见。不幸的是,这个链接没有说明如何生成它们。如果你想自己实现它,你可以在谷歌上搜索“Knuth算法L”。