Условная матрица или комбинации в R - PullRequest
0 голосов
/ 14 ноября 2018

у меня 7 векторов:

vector1 = c(9,8,7,6,5)
vector2 = c(10,20,30)
vector3=c(19,27,34,40,45)
vector4=c(29,37,44)
vector5=c(39,47)
vector6=c(28,36)
vector7=c(13,42)
vector=c(vector1,vector2,vector3,vector4,vector5,vector6,vector7)

co = expand.grid(vector,vector,vector,vector,vector,vector)

Мне нужна таблица комбинаций из 6 переменных указанных выше векторов, но значение в каждом векторе не должно повторяться более 2 раз в каждой строке этой таблицы, и одинаковые числа не должны присутствовать в каждой строке. Например:

V1 V1 V2 V3 V4 V7

V1 V3 V4 V5 V6 V7

Как я могу это сделать?

V1 = c (9,8,7,6,5)
V2 = c (10,20,30)
V3 = c (19,27,34,40,45)
V4 = c (29,37,44)
V5 = c (39.47)
V6 = c (28.36)
V7 = c (13,25,42)

У меня 7 векторных групп. Я хочу перечислить их в комбинациях с 6 переменными. В каждом ряду этих 7 групп не должно быть более двух членов.

В качестве второго условия,

x1 = 1: 9
x2 = 10:19
x3 = 20:29
x4 = 30: 39
x5 = 40:49

У меня есть группы, как показано выше. В каждой строке списка комбинаций не должно быть более 3 членов в диапазоне групп x1, x2, x3, x4 или x5.

Например: в комбинации 2 3 5 7 19 25 количество членов x1 не должно быть в списке комбинаций, поскольку они больше 3.

1 Ответ

0 голосов
/ 14 ноября 2018

Вот идея.Это не очень хороший ответ, потому что я не проверил его полностью, но думаю, что это должно сработать.Это довольно неэффективно, и у меня не хватило терпения запустить его достаточно долго, чтобы завершить.

y = rep(vector, 2)
result = unique(
  lapply(
    Filter(f = function(x) !anyDuplicated(x),
     combn(y, m = 6, simplify = FALSE)
    ),
  sort)
)

Объяснение: сделайте две копии всех ваших входных данных в векторе.Создайте все комбинации, выбирая 6 элементов.Отфильтруйте любые результаты с дубликатами.Сортируйте их, чтобы они были в последовательном порядке.Сохраняйте уникальные комбинации.

Это неэффективно, потому что первый шаг будет генерировать choose(length(y), 6) ~= 7M комбинаций, которые мы затем должны уменьшить до (я думаю) 166 638 финальных комбинаций.Но это самый простой способ написать ваши требования.

...