Как изменить мои существующие коды R, чтобы вывод ограничивался только этим конкретным условием? - PullRequest
0 голосов
/ 26 января 2019

Я использую R в RStudio, и у меня есть следующее list:

list1 <- c(1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,20)

Я хочу вывести все комбинации из 3 чисел (без замены) из этого list, которые будут sum, скажем, 50.

Я думаю об использовании RcppAlgos library в R. У меня есть следующие коды:

list1 <- c(1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,20)
uni <- unique(list1)
myRep <- rle(list1)$lengths
ans <- 50

library(RcppAlgos)
lapply(seq_along(uni), function(x) {
    comboGeneral(uni, x, freqs = myRep,
                 constraintFun = "sum",
                 comparisonFun = "==",
                 limitConstraints = ans)
})

Если я выполню этот код, он выведет ВСЕ комбинации, которые в сумме составят 50.

Как я могу ограничить вывод только теми комбинациями с 3 числами?

Я также хочу, чтобы выходные данные показывали ВСЕ результаты вместо того, чтобы давать мне сообщение «Максимальный достигнут».

Примечание: я открыт для использования другого пакета, если таковой имеется.

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Вы можете попробовать это:)

list1 <- c(1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,20)

# combn generates all possible combinations when selecting 3 items from list1
combs = combn(list1, 3)

# select all combs which sum up to 50 (just transposed the matrix to have the combinations rowwise)
t(combs[,colSums(combs) == 50])
# check if we got the right combinations
rowSums(t(combs[,colSums(combs) == 50]))

если вам нужно ускорить это, вы можете удалить некоторые значения из списка, прежде чем делать это. Наименьшее число, которое может привести к сумме 50, равно 11 (поскольку два самых больших значения в списке - 20 и 19). Таким образом, вы можете удалить от 1 до 10.

0 голосов
/ 26 января 2019

lapply(seq_along(uni) проходит по последовательности 'uni', и это идет к аргументу 'm' (то есть, количество элементов на выбор). В первом случае он делает 1, затем 2 и так далее. В нашем конкретном случае требуется только 3, и нам не нужен цикл для этого

comboGeneral(uni, 3, freqs = myRep, constraintFun = "sum", 
      comparisonFun = "==", limitConstraints = ans)
...