17

是否有一种直接的方法来生成专门排除重复元素的整数向量(1 到最大 999)的所有可能排列?

例如,对于具有 1 到 9 范围内的三个元素的向量,该序列1 2 3是可以接受的,1 2 91 2 2会是无效的。序列必须包含准确的n元素(在本例中为三个)。编辑:为避免混淆,订单很重要,因此1 2 9并且9 2 1都是有效的和必需的。

关于在 SO 上使用 R 的排列和组合有很多问题(例如thisthis),但似乎没有一个适合这种特殊情况。我希望有一个不起眼的基本 R 或包函数可以处理它,而无需我自己编写一个不优雅的函数。

4

3 回答 3

29

使用gtools包:

require(gtools)
permutations(n = 9, r = 3, v = 1:9)
# n -> size of source vector
# r -> size of target vector
# v -> source vector, defaults to 1:n
# repeats.allowed = FALSE (default)
于 2013-02-05T09:29:34.033 回答
11

utils::combn ; combinat::combn或者combinat::permn 是替代品。

于 2013-02-05T13:14:58.757 回答
10

编辑:这不是 OP 要求的,但我留下了这个答案,以避免混淆。

我的数学有点生疏,但我认为您描述的是组合,而不是排列。基函数combn()返回组合。

我用一个可管理的集合来说明 - 所有长度为 3 的组合,来自向量1:4

combn(4, 3)
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    2
[2,]    2    2    3    3
[3,]    3    4    4    4

combinations和之间的区别在于permutations顺序combinations无关紧要。所以(2, 3, 4)(4, 3, 2)是相同的组合,但排列不同。

于 2013-02-05T09:33:25.703 回答