是否有一种直接的方法来生成一个整数向量(1到最大999)的所有可能的排列,这些排列明确地排除了重复的元素?
例如,对于具有1到9范围内的三个元素的向量,序列1 2 3
是可接受的,1 2 9
也是可接受的,但1 2 2
将无效。序列必须包含完全n
个元素(在本例中为3个)。编辑:为了避免混淆,订单很重要,因此1 2 9
和9 2 1
都是有效且必需的。
关于在SO上使用R的排列和组合有很多问题(例如this和this),但似乎没有一个适合这种特殊情况。我希望有一个不起眼的基础R或包功能,它将照顾它,而我自己不必写一个没有优雅的功能。
答案 0 :(得分:22)
使用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)
答案 1 :(得分: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)
是相同的组合,但排列不同。
答案 2 :(得分:9)
utils::combn
; combinat::combn
或combinat::permn
是替代方案。