【问题标题】:How to Multiple functions to a data frame如何对数据框进行多个功能
【发布时间】:2019-02-05 13:46:03
【问题描述】:

我正在为联络中心创建一个人数模型。我想将 erlang c 应用于我的预测数据的新列(通过 RODBC con 提取的预测)

当我应用我的 erlang c 公式时,我收到多个警告,大部分都是重复的。公式确实可以运行,但只有第一行是准确的。

警告信息:

1:在 1:agents 中:数值表达式有 96 个元素:只使用第一个

2: 在 while (gos 1)/100) { : 条件的长度 > 1,并且只使用第一个元素

3:在 1:agents 中:数值表达式有 96 个元素:只使用第一个

4: 在 while (gos 1)/100) { : 条件的长度 > 1,并且只使用第一个元素

问题是我需要一些输入才能从数据框中提取函数

我需要该函数从数据框中的当前行获取呼叫量和 AHT,并计算出员工人数要求

数据是一个基本表,由日期、日期、月份 AHT 和调用列组成

我尝试了不同的应用方法:

  1. 我用过 Lapply

  2. 我已尝试通过创建新列来添加它

  3. 我尝试过使用rep函数

  4. 我尝试过使用 for 循环

#
  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 个代理计算

【问题讨论】:

  • 欢迎来到 SO。您能否尝试将您的问题简化为更轻的问题。所以我们会更容易理解,您可能会在途中找到您的解决方案。但是,警告似乎很明确:gos 不止一维。不应该是这样。你应该试着看看你在哪里/为什么你有length(gos)&gt;1
  • 那个代码不是erlang,那为什么你的问题有一个erlang标签?

标签: r


【解决方案1】:

如果我理解正确,CallsDuration 参数可能是向量,而其他参数是模型的参数。一个简单的解决方案是 vectorize 函数本身:

vresource <- Vectorize(resource)

Vectorize 将函数转换为同时接受向量和常量 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 &lt;- with(df, vresource(Calls, Duration, Wait_time, gos_target, 15)))轻松地将其添加到数据框中。

【讨论】:

  • 成功了,非常感谢
猜你喜欢
  • 2022-07-06
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
相关资源
最近更新 更多