Как создавать комбинации подмножеств, чтобы в конечном наборе не было повторяющихся элементов [дубликаты]

Я пытаюсь создать подмножество списка, охватывающее все возможные комбинации с условием, что конечный результат имеет ту же длину, что и исходный список, и нет повторяющихся элементов.

Для списка:

X <- c("A","B","C","D")

Все ненулевые подмножества (назовем это Y):

[('A'), ('B'), ('C'), ('D'), ('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'),
('B', 'D'), ('C', 'D'), ('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'C', 'D'), 
('B', 'C', 'D'), ('A', 'B', 'C', 'D')]

Я ищу такие комбинации Y, чтобы элементы в комбинации были разными значениями X.

Вот некоторые из допустимых комбинаций:

 (('A',), ('B',), ('C', 'D'))
 (('A',), ('C',), ('B', 'D'))
 (('A',), ('D',), ('B', 'C'))
 (('B',), ('C',), ('A', 'D'))
 (('B',), ('D',), ('A', 'C'))
 (('C',), ('D',), ('A', 'B'))

Я попытался оценить все возможные комбинации Y, а затем получить длину различных значений каждой комбинации.

Если length(distinct elements of combination) = length(X), то я сохраняю комбинацию. Но это ни в коем случае не оптимальный метод, и он не распространяется на повторяющиеся сценарии.

Кроме того, в моем реальном сценарии у меня есть до 40 различных элементов в X.


person constraint_random    schedule 11.05.2019    source источник
comment
Вы можете использовать partitions::listParts() или partitions::setparts(), например, здесь. Однако количество разделов для набора из 40 элементов будет просто астрономическим (некоторое число, например, 40! или, вероятно, намного больше), так что вы не приблизитесь к тому, чтобы перечислить их все.   -  person Josh O'Brien    schedule 14.05.2019
comment
@JoshO'Brien Спасибо, Джош, в итоге я использовал это, но да, набор данных становится огромным, и моя машина зависает при наборах больше 10.   -  person constraint_random    schedule 14.05.2019
comment
@ M-M Я пытаюсь уменьшить свой набор данных или разделить его, чтобы я мог получить все комбинации по отдельности и применить к ним перекрестную комбинацию, что может снизить нагрузку. Я обновлю, если найду более эффективный способ   -  person constraint_random    schedule 14.05.2019


Ответы (1)


X = c("A","B","C","D")
  1. использовать комбинацию()
comb = c()
for(n in 1:length(X)){
  comb = c(comb, apply(combn(X, n), MARGIN = 2, FUN = "paste", collapse = ""))
}
comb
 [1] "A"    "B"    "C"    "D"    "AB"   "AC"   "AD"   "BC"   "BD"   "CD"   "ABC"  "ABD"  "ACD" 
[14] "BCD"  "ABCD"
  1. используйте расширение.grid()
expand.grid(X, X)
   Var1 Var2
1     A    A
2     B    A
3     C    A
4     D    A
5     A    B
6     B    B
7     C    B
8     D    B
9     A    C
10    B    C
11    C    C
12    D    C
13    A    D
14    B    D
15    C    D
16    D    D
person Seungwook Kim    schedule 12.05.2019