以前的答案是缺乏一种方式来获得一个特定的结果,即保持自我,但对不同的订单删除的。该包具有用于这些目的的两个功能,即combinations
和permutations
。 According to this website:
- 当顺序无关紧要时,它是一个组合。
- 当订单确实重要时,它是一个置换。
在这两种情况下,我们决定把的重复是否允许与否,相应地,这两个功能有repeats.allowed
说法,得到4个组合(可口元!)。这是值得的每一个这些。为了便于理解,我将矢量简化为单个字母。
排列组合与重复
最广泛的选择是让这两个自我的关系,不同的排序选项:
> permutations(n = 3, r = 2, repeats.allowed = T, v = c("a", "b", "c"))
[,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"
这给了我们9个选项。该值可以从简单公式n^r
(即3^2=9
)中找到。对于熟悉SQL的用户,这是the Cartesian product/join。有两种方法可以限制这种情况:1)消除自我关系(不允许重复),或者2)删除不同的有序选项(即组合)。
组合与重复
如果我们要删除不同的排序选项,我们使用:
> combinations(n = 3, r = 2, repeats.allowed = T, v = c("a", "b", "c"))
[,1] [,2]
[1,] "a" "a"
[2,] "a" "b"
[3,] "a" "c"
[4,] "b" "b"
[5,] "b" "c"
[6,] "c" "c"
这给了我们6个选项。该值的公式为(r+n-1)!/(r!*(n-1)!)
,即(2+3-1)!/(2!*(3-1)!)=4!/(2*2!)=24/4=6
。
排列组合没有重复
相反,如果我们希望禁止重复,我们使用:
> permutations(n = 3, r = 2, repeats.allowed = F, v = c("a", "b", "c"))
[,1] [,2]
[1,] "a" "b"
[2,] "a" "c"
[3,] "b" "a"
[4,] "b" "c"
[5,] "c" "a"
[6,] "c" "b"
这也为我们提供了6个选项,但不同的!选项的数量与上述相同,但这是巧合。该值可以从公式n!/(n-r)!
,即(3*2*1)/(3-2)!=6/1!=6
中找到。
组合,而无需重复
最重要的限制是,当我们想既不自我关系/重复或不同订购的选件,在这种情况下,我们使用:
> combinations(n = 3, r = 2, repeats.allowed = F, v = c("a", "b", "c"))
[,1] [,2]
[1,] "a" "b"
[2,] "a" "c"
[3,] "b" "c"
这给我们提供了三种选择。选项的数量可以从相当复杂的公式n!/(r!(n-r)!)
即3*2*1/(2*1*(3-2)!)=6/(2*1!)=6/2=3
来计算。
不是[this](https://stackoverflow.com/questions/12245213/how-to-generate-all-possible-combinations-of-vectors-without-caring-for-order)只是同一个问题? – 5th
[如何生成所有可能的矢量组合而不关心顺序?](https://stackoverflow.com/questions/12245213/how-to-generate-all-possible-combinations-of-vectors-without-关怀订购) – 5th
我不这么认为。这个问题涉及到单个向量的元素。接受的答案也提供了一种方法来产生从多个输入元素(2或更多) – Michele