Образец с ограничением, векторизация - PullRequest
1 голос
/ 30 ноября 2011

Каков наиболее эффективный способ выборки кадра данных при определенном ограничении?

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

Ответы [ 3 ]

1 голос
/ 30 ноября 2011

Насколько велик ваш набор данных? Если оно маленькое (а маленькое зависит от вашего оборудования), вы можете просто перечислить все группы по три, рассчитать сумму и произвести выборку из этого.

## create data frame
N <- 100
salary <- rnorm(N))
## list all possible groups of 3 from this
x <- combn(salary, 3)
## the sum
sx <- colSums(x)
sxc <- sx[sx<1]
## sampling with replacement
sample(sxc, 10, replace=TRUE) 
1 голос
/ 30 ноября 2011

Вы можете столкнуться с комбинаторным взрывом.Это моделирует выбор 3 комбинаций ЭЭ из набора 20 с зарплатой в среднем 60 и с.д. 20. Это показывает, что из перечисления 1140 комбинаций вы найдете только 263 с суммой зарплат менее 150.

> sum( apply( combn(1:20,3) , 2, function(x) sum(salry[x, "sals"]) < 150))
[1] 200
> set.seed(123)

> salry <- data.frame(EEnams = sapply(1:20 , 
                                       function(x){paste(sample(letters[1:20], 6) , 
                                             collapse="")}), sals = rnorm(20, 60, 20))
> head(salry)
  EEnams     sals
1 fohpqa 67.59279
2 kqjhpg 49.95353
3 nkbpda 53.33585
4 gsqlko 39.62849
5 ntjkec 38.56418
6 trmnah 66.07057

> sum( apply( combn(1:NROW(salry), 3) , 2, function(x) sum(salry[x, "sals"]) < 150))
[1] 263

Если бы у вас было 1000 EE, вы бы получили:

> choose(1000, 3)   # Combination possibilities
# [1] 166,167,000   Commas added to output
1 голос
/ 30 ноября 2011

Один из подходов - начать с полного фрейма данных и выбрать один случай. Создайте фрейм данных, который состоит из всех случаев, зарплата которых меньше вашего ограничения минус выбранная зарплата. Выберите второй случай из этого и повторите процесс создания оставшегося набора вариантов на выбор. Остановитесь, если вы доберетесь до нужного вам числа (3) или если в какой-то момент во фрейме данных не будет ни одного случая выбора (откажитесь от того, что у вас есть, и повторите процедуру выборки).

Обратите внимание, что разные подходы будут создавать разные распределения вероятностей для включаемого случая; как правило, оно не будет единообразным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...