В предыдущих ответах отсутствовал способ получить конкретный результат, а именно сохранить собственные пары, но удалить их с разными порядками. Пакет gtools содержит две функции для этих целей, 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
. Это the Cartesian product/join для пользователей, знакомых с SQL.
Есть два способа ограничить это: 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
.
Это не [это] (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