Моя цель состоит в создании уникального списка комбинаций, когда мы знаем, что может существовать аналогичная комбинация переменных, поскольку часть используемого множества имеет повторяющиеся значения. Таким образом, проблема, которую я пытаюсь решить, заключается в получении всех комбинаций без замены на отдельные элементы. Решение должно быть общим (т. Е. Работает для любого набора из N элементов с значениями M различных элементов. Таким образом, решение должно работать с N = 4, M = 2 с (Var1 = Var2, Var3 = Var4) или (Var1 = Var2 = Var3, Var4) и т. Д.). В качестве простого примера, что я пытаюсь сделать, взять три переменные: X, Y, ZСоздание уникальных комбинаций при наличии дубликатов
КомбинацииКлассические являются:
X Y Z
Y Z
X Z
Z
X Y
Y
X
Если Х = Y, то мы имеем:
X X Z
X Z
X Z
Z
X X
X
X
Таким образом, у нас есть две комбинации, которые не являются «уникальными»: (X) и (XZ).
Итак, список, что я хочу это:
X X Z
X Z
Z
X X
X
Edit: Добавлен случай, когда N = 4 в соответствии с рекомендациями Томас @ Сэм
Если разложить это N = 4 , мы имеем: W, X, Y, Z
W X Y Z
X Y Z
W Y Z
Y Z
W X Z
X Z
W Z
Z
W X Y
X Y
W Y
Y
W X
X
W
Здесь мы можем иметь M = 2 отдельных элементов в формах либо: (W = X, Y = Z) (X = Z, W = Y), (X = Y, W = Z), (W = X = Y, Z), (W = Z = Y, X), (W = Z = X, Y) или (X = Y = Z, W).
В случае (W = X, Y = Z), имеем:
W W Y Y
W Y Y
W Y Y
Y Y
W W Y
W Y
W Y
Y
W W Y
W Y
W Y
Y
W W
W
W
Вывод должен быть:
W W Y Y
W Y Y
Y Y
W W Y
W Y
Y
W W
W
В случае, (W = Х = Y, Z) матрица будет первоначально выглядеть следующим образом:
W W W Z
W W Z
W W Z
W Z
W W Z
W Z
W Z
Z
W W W
W W
W W
W
W W
W
W
желаемый результат будет:
W W W Z
W W Z
W Z
Z
W W W
W W
W
End Edit
Использование R, у меня уже есть способ создания списка всех возможных комбинаций в двоичном виде матрицы:
comb.mat = function(n){
c = rep(list(1:0), n)
expand.grid(c)
}
comb.mat(3)
Это дает:
Var1 Var2 Var3
1 1 1 1
2 0 1 1
3 1 0 1
4 0 0 1
5 1 1 0
6 0 1 0
7 1 0 0
8 0 0 0
Если мы рассмотрим Var1 = Var2, эта структура будет иметь избыточность. например линии (2,3), а затем (6,7) будут представлять один и тот же объект.Таким образом, избыточность бесплатной версии будет:
Var1 Var2 Var3
1 1 1 1
2 0 1 1
4 0 0 1
5 1 1 0
6 0 1 0
8 0 0 0
Для добавления значения «Variable», аналогичные исходной структуры, я использую:
nvars = ncol(m)
for(i in 1:nvars){
m[m[,i]==1,i] = LETTERS[22+i]
}
Чтобы изменить его так, чтобы Переменная1 = Переменная2, я просто использовать :
m[m[,i]=="Y",i] = "X"
Любые предложения относительно того, как я мог бы перейти от исходной матрицы к более поздней матрице?
Особенно, если у нас есть больше переменных, которые сопряжены?
E.g. comb.mat (4), с: (Var1 = Var2, Var3 = Var4) или (Var1 = Var2 = Var3, Var4)
Я думаю- см. '? Combn' –
' combn' не дает правильной структуры, например. combn (c ("X", "Y", "Z"), 2) => [["X", "X", "Y"], ["Y", "Z", " Z "]] Обратите внимание, что X повторяется, даже если он поставляется только один раз. Аналогично, Z повторяется. – coatless
Может помочь показать результат, который вы ищете в обновленном примере с помощью 'comb.mat (4)' – Whitebeard