Разработка функции для вывода наименьшего возможного множества победителей - PullRequest
4 голосов
/ 17 января 2020

Я пытаюсь разработать функцию / формулу, в которой вам даны две целочисленные переменные, представляющие, например, 5 и 100. Первое число может представлять 5 видов мороженого в опросе, а 100 - число людей, которых отбирают, спрашивают их любимое мороженое.

Я хочу разработать функцию / формулу, которая бы вырабатывала комбинацию чисел, при которой 1 из 5 вкусов мороженого может выиграть наименьшим множеством (поэтому я в большинстве случаев, на 1), и имеют наименьшее возможное число в зависимости от количества вкусов мороженого в опросе.

Так что с 5 ароматами мороженого и 100 респондентами я бы хотел, чтобы R произвел вектор (порядок не очень важен):

[1] 21 20 20 20 19

Поскольку 21 - наименьшее возможное число для победителя большинства вкусов мороженого из 100 респондентов и 5 вкусов. Как функция, она должна иметь дело с тем, когда число вариантов выбора не делится аккуратно с числом респондентов.

Желаемый результат

combinations_function <- function(x, y) {
  ?????
}

combinations_function(5, 100)
[1] 21 20 20 20 19

combinations_function(5, 38)
[1] 9 8 7 7 7

combinations_function(7, 48)
[1] 8 7 7 7 7 6 6

Ответы [ 2 ]

4 голосов
/ 17 января 2020

Думаю, я понял:

smallest_margin <- function(choices, respondents)
{
    values = rep(respondents %/% choices, choices)
    remainder = respondents %% choices
    while(remainder != 0)
    {
      values[which.min(values)] <- values[which.min(values)] + 1
      remainder = remainder - 1
    }
    if(length(which(values == max(values))) > 1)
      values[which(values == max(values))[1:2]] <- 
      values[which(values == max(values))[1:2]] + c(-1, 1)
    return(sort(values))
}

smallest_margin(5, 100)
# [1] 19 20 20 20 21
smallest_margin(1, 100)
# [1] 100
smallest_margin(5, 99)
# [1] 19 19 20 20 21
smallest_margin(12, 758)
# [1] 63 63 63 63 63 63 63 63 63 63 63 65
3 голосов
/ 17 января 2020

Вот код-гольфист подход

f <- function(x,y) 
  rep(y%/%x, x) + ifelse(rep(y%%x>0, x), 
                         c(1^(1:(y%%x)), 0*((y%%x+1):x)), 0) + c((-1)^(0:1), 0*(3:x))

Пример

f(5, 100)
# [1] 21 19 20 20 20
f(5, 38)
# [1] 9 7 8 7 7
f(5, 48)
# [1] 11  9 10  9  9
f(7, 48)
# [1] 8 6 7 7 7 7 6
...