Поиск списка всех комбинаций из 6 чисел, которые составляют до 10 - PullRequest
2 голосов
/ 14 октября 2019

Итак, я видел похожие версии этого вопроса, заданные ранее ( Получение всех комбинаций, сумма которых до 100, с использованием R ), но я изо всех сил пытаюсь найти способ выяснить, что мне нужно для запускав частности. Я пытаюсь создать список в R из всех различных комбинаций из 6 чисел, которые в сумме дают 10. Однако я хочу включить 0 и повторения того же # в строке. Таким образом, это выглядело бы примерно так:

10 0 0 0 0 0 9 1 0 0 0 0 8 2 0 0 0 0 Я попытался запустить следующее:

C = t(restrictedparts(10,6, include.zero=TRUE))
ComboSet<-data.frame(do.call(rbind, lapply(1:nrow(C),function(i) getall(iterpc(table(C[i,]), order=T)))))

Однако, когда я делаю это, кажется, не включаетвариации, которые имеют 0 в них. Я пытался ввести функцию include.zero = TRUE в разные части того, что я запускаю, но мне пока не повезло. Какие-либо предложения?

1 Ответ

0 голосов
/ 15 октября 2019

Это хороший вопрос, и ответ не очень очевиден.

Здесь есть много вопросов, на которые следует обратить внимание. Для начала убедитесь, что вы включили библиотеки, которые вы используете в своем примере. По опыту знаю, что вы используете partitions и iterpc. Из документации partitions мы видим, что есть функция, которая возвращает именно то, что вы ищете, без каких-либо дополнительных шагов. Это функция compositions, которая генерирует Целочисленные композиции .

myComps <- t(as.matrix(compositions(10, 6)))
head(myComps)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   10    0    0    0    0    0
[2,]    9    1    0    0    0    0
[3,]    8    2    0    0    0    0
[4,]    7    3    0    0    0    0
[5,]    6    4    0    0    0    0
[6,]    5    5    0    0    0    0

dim(myComps)
[1] 3003    6

all(rowSums(myComps) == 10)
[1] TRUE

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

## The 1's should be 0's and the 2's should be 10's
ComboSet[1:6, ]
X1 X2 X3 X4 X5 X6
1  1  1  1  1  1  2
2  1  1  1  1  2  1
3  1  1  1  2  1  1
4  1  1  2  1  1  1
5  1  2  1  1  1  1
6  2  1  1  1  1  1

## OP's original code
ComboSet<-data.frame(do.call(rbind, lapply(1:nrow(C),function(i) getall(iterpc(table(C[i,]), order=T)))))

all(rowSums(ComboSet) == 10)
[1] FALSE

table(rowSums(ComboSet))

7   8   9  10  11  12  13  14  15  16 
12  30 150 255 186 690 420 420 180 660

## Here is the fix with labels explicitly declared
ComboSetFix <- data.frame(do.call(rbind, lapply(1:nrow(C), function(i) {
    getall(iterpc(table(C[i,]), labels = as.integer(names(table(C[i,]))), order=T))
})))

all(rowSums(ComboSetFix) == 10)
[1] TRUE

dim(ComboSetFix)
[1] 3003    6

Вы должны знать, что iterpc был заменен наarrangements (его больше нет на CRAN). У него другой интерфейс, поэтому вы не можете просто заменить слово «iterpc» на «аранжировки».

...