Произвольная выборка значений из пула, чтобы сумма была меньше порога в R - PullRequest
0 голосов
/ 24 сентября 2018

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

pool = data.frame(ID = letters, value = sample(1:5, size = 26, replace = T))
> print(pool)
   ID  value
1  a     1
2  b     4
3  c     4
4  d     2
5  e     2
6  f     4
7  g     5
8  h     5
9  i     4
10 j     3
11 k     3
12 l     5
13 m     3
14 n     2
15 o     3
16 p     4
17 q     1
18 r     1
19 s     5
20 t     1
21 u     2
22 v     4
23 w     5
24 x     2
25 y     4
26 z     1

Я хочу случайным образом выбрать любое количество идентификаторов, чтобы сумма значений для этих идентификаторов находилась между двумя порогами, скажем, между 8 и10 (включая две границы).Ожидаемый результат должен быть таким:

  • c ("a", "b", "c")
  • c ("f", "g")
  • c ("a", "d", "e", "j", "k")

Я думаю, что этот вопрос ранее не задавался.У кого-нибудь есть подсказки?

1 Ответ

0 голосов
/ 24 сентября 2018

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

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

set.seed(42)
library(dplyr)
sample_in_range <- function(src_tbl, min_sum = 8, max_sum = 10, max_iter = 100) {
  for(i in 1:max_iter) {
    output <- src_tbl %>% 
      sample_n(nrow(src_tbl)) %>%
      mutate(ID = as.character(ID),
             cuml = cumsum(value)) %>%
      filter(cuml <= max_sum)
    if(max(output$cuml) >= min_sum) return(output)
  }
}

output <- sample_in_range(pool)
output
  ID value cuml
1  k     3    3
2  w     2    5
3  z     4    9
4  t     1   10

output %>% pull(ID)
[1] "k" "w" "z" "t"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...