Как сделать несколько функций для фрейма данных - PullRequest
0 голосов
/ 05 февраля 2019

Я создаю модель численности персонала для контакт-центра.Я хотел бы применить erlang c к новому столбцу моих прогнозируемых данных (прогноз извлекается через RODBC con)

Когда я применяю формулу erlang c, я получаю несколько предупреждений, в основном повторяющихся.Формула работает, но точна только 1-я строка.

Предупреждающие сообщения:

1: В 1: агенты: числовое выражение имеет 96 элементов: используется только первый

2: в то время как (gos 1) / 100) {: условие имеет длину> 1, и будет использоваться только первый элемент

3: в 1: агенты:числовое выражение имеет 96 элементов: только первый использованный

4: In while (gos 1) / 100) {: условие имеет длину> 1, и будет использоваться только первый элемент

Проблема в том, что мне нужны некоторые входные данные для функции, чтобы извлечь из фрейма данных

Мне нужна функция, чтобы взять громкость вызова и AHT из этой текущей строки вфрейм данных и выработка требования о численности персонала

Данные представляют собой базовую таблицу, состоящую из столбцов даты, дня, месяца и вызовов

Я пробовал разные способы его применения:

  1. Я использовал Lapply

  2. Я попытался добавить его, создав новый столбец

  3. Я попытался использовать функцию повторения

  4. Я пыталсяиспользование для цикла

#
  Interval <- 15
  Calls <- Should pull from Data
  Duration <- Should pull from Data
  Wait_time <- 20
  gos_target <- 90
  Shrinkage <- 21
  Rate <- Calls *(60/Interval)

  intensity <- function(rate, duration, interval = 60) {
    (rate / (60 * interval)) * duration
  }

  erlang_c <- function(agents, rate, duration, interval = 60) {
    int <- intensity(rate, duration, interval)
    erlang_b_inv <- 1
    for (i in 1:agents) {
      erlang_b_inv <- 1 + erlang_b_inv * i / int
    }
    erlang_b <- 1 / erlang_b_inv
    agents * erlang_b / (agents - int * (1 - erlang_b))
  }

  service_level <- function(agents, rate, duration, target, interval = 60) {
    pw <- erlang_c(agents, rate, duration, interval)
    int <- intensity(rate, duration, interval)
    1 - (pw * exp(-(agents - int) * (target / duration)))
  }

  resource <- function(rate, duration, target, gos_target, interval = 60) {
    agents <-round(intensity(rate, duration, interval) + 1)
    gos <- service_level(agents, rate, duration, target, interval)
    while (gos < gos_target * (gos_target > 1) / 100) {
      agents <- agents + 1
      gos <- service_level(agents, rate, duration, target, interval)
    }
    return(c(ceiling(agents/(1-(Shrinkage/100)))))
  }

  resource(Calls, Duration, Wait_time, gos_target, 15)
#

Мне нужно, чтобы каждый столбец давал мне точную численность персонала.когда я запускаю его для одной строки данных, любой строки, ответ всегда точен.как только у меня будет более одной строки данных, мои результаты по численности персонала будут подсчитаны, но всегда будут неточными, от 5 до 15 агентов

1 Ответ

0 голосов
/ 05 февраля 2019

Если я правильно понимаю, аргументы Calls и Duration являются потенциальными векторами, тогда как другие аргументы являются параметрами модели.Одним простым решением было бы векторизация самой функции:

vresource <- Vectorize(resource)

Векторизация выполняет преобразование функции в функцию, которая принимает как векторы, так и значения константы v, и применяет ее к тем, которыевекторы параллельно.Это приведет к следующему результату со следующим фреймом данных:

R> df <- data.frame(Calls=c(1,5,3,7), Duration=c(30,50,45,10))
R> with(df, vresource(Calls, Duration, Wait_time, gos_target, 15))
[1] 2 3 3 2

Затем его можно легко добавить к фрейму данных, назначив его новому столбцу, например, df$resource <- with(df, vresource(Calls, Duration, Wait_time, gos_target, 15)).

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