Как я могу создать комбинации элементов с не более чем х повторений для каждого - PullRequest
0 голосов
/ 04 ноября 2018

Я бы сгенерировал комбинации вектора x из 5 элементов с максимум 2 повторениями для каждого элемента.

x = c(1,2,3,4,5,6,7,8,9,10)  

Я использую combn(x,5), но возвращаю комбинацию из 5 элементов без повторения.

В выводе я буду выглядеть так: ((1,2,3,4,5), (1,2,3,4,6), ..., (1,1,3,4,5) , (1,2,3,4,4), (1,1,2,2,3), ...)

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

Ответы [ 2 ]

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

Вы после комбинации мультимножеств. Есть пара библиотек, способных выдавать желаемый результат без создания дубликатов комбинаций: arrangements и RcppAlgos, которые я создал. Вот как вы бы это использовали:

arrangements::combinations(5, 5, freq = rep(2, 5))

RcppAlgos::comboGeneral(5, 5, freqs = rep(2, 5))

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

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

Вы можете просто удвоить элементы в x, используя rep. Создание собственного вектора таким образом дает вам полный контроль над количеством повторений.

combn(x,5)
x <- rep(c(1:5),2)
> head(t(combn(x,5)))
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    1    2    3    4    1
[3,]    1    2    3    4    2
[4,]    1    2    3    4    3
[5,]    1    2    3    4    4
[6,]    1    2    3    4    5

РЕДАКТИРОВАТЬ: как прокомментировано, это будет генерировать дубликаты, если это не то, что вы хотите, вы можете использовать unique(t(combn...))), чтобы удалить эти дубликаты.

...