Разбиение и перестановка с использованием R - PullRequest
2 голосов
/ 23 февраля 2020

Я пытаюсь найти все возможные разбиения (включая 0) M на N частей, используя R. Затем я бы хотел переставить каждый результат без замены и без повторения.

Например, для M = 4 и N = 2, я хочу получить:

[1,] 4 3 2 0 1
[2,] 0 1 2 4 3 

Теперь я могу получить:

[1,] 4 3 2
[2,] 0 1 2

, используя partitions::restrictedparts(4, 2, include.zero=TRUE). Как мне продолжить?

Чтобы дать некоторое представление об этом вопросе, я на самом деле пытаюсь найти все возможные результаты по количеству совпадений каждой стороны после показа объявления ie в течение 60 раз.

1 Ответ

2 голосов
/ 24 февраля 2020

В пакете, который вы сейчас используете (например, partitions), есть функция, которая делает именно то, что вы ищете. Он соответственно называется compositions (см. Композиция (комбинаторика) для получения дополнительной информации).

partitions::compositions(4, 2)

[1,] 4 3 2 1 0
[2,] 0 1 2 3 4

Теперь, чтобы решить вашу актуальную проблему, у нас есть:

myParts <- partitions::compositions(60, 6)  ## Note that include.zero is TRUE by default

dim(myParts)
[1]       6 8259888

А вот и вывод:

transMat <- t(as.matrix(myParts))
head(transMat)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   60    0    0    0    0    0
[2,]   59    1    0    0    0    0
[3,]   58    2    0    0    0    0
[4,]   57    3    0    0    0    0
[5,]   56    4    0    0    0    0
[6,]   55    5    0    0    0    0

tail(transMat)
           [,1] [,2] [,3] [,4] [,5] [,6]
[8259883,]    1    0    0    0    0   59
[8259884,]    0    1    0    0    0   59
[8259885,]    0    0    1    0    0   59
[8259886,]    0    0    0    1    0   59
[8259887,]    0    0    0    0    1   59
[8259888,]    0    0    0    0    0   60
...