Уникальные комбинации векторных элементов, соответствующие критериям - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть вектор целых чисел, например, totalVector <- c(4,2,1), и две переменные totalResult и totalNumber.Я хочу сделать следующее:

Я хочу найти все УНИКАЛЬНЫЕ комбинации элементов totalNumber из totalVector, которые складываются в totalResult.Чтобы уточнить, если totalResult = 100 и totalNumber = 50, я хочу, чтобы все комбинации из 50 элементов из totalVector имели сумму 100 (очевидно, допускаются повторения, но дублирующие результаты, такие как 25 четверок и 25 переставленных четверок, должны учитываться толькоодин раз).

Первоначально я сделал это, расширив общий вектор (повторяя каждый элемент 50 раз), получив все комбинации из 50 элементов с combn(), а затем отфильтровав их суммы.Однако для больших значений это оказалось очень неэффективно и не удалось из-за большого количества данных.Есть ли более быстрый и менее трудоемкий способ сделать это?

Ответы [ 2 ]

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

Я думаю, что ОП ищет комбинации с повторением вектора, которые суммируются с определенным числом. Это сделает это:

totalVector <- c(4,2,1)
totalNumber <- 50
totalResult <- 100

library(RcppAlgos)
myAns <- comboGeneral(totalVector, totalNumber, repetition = TRUE,
                      constraintFun = "sum", comparisonFun = "==",
                      limitConstraints = totalResult)

dim(myAns)
[1] 17 50

all(apply(myAns, 1, sum) == totalResult)
[1] TRUE

Отказ от ответственности: я являюсь автором RcppAlgos

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

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

tv <- sample(1:10, 10, replace = TRUE)
tn <- 5
tr <- 20
combinations <- combn(tv, tn)
equals.tr <- apply(combinations, MARGIN = 2, FUN = function(x) sum(x) == tr)
combinations[, equals.tr]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...