如何对数据框进行多种功能

时间:2019-02-05 13:46:04

标签: r

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

应用我的erlang c公式时,我会收到多个警告,大多数情况下都是重复这些警告。该公式可以运行,但是只有第一行是正确的。

警告消息:

  

1:在1:agents中:数值表达式包含96个元素:仅第一个使用

     

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

     

3:在1:agents中:数值表达式包含96个元素:仅第一个使用

     

4:在一会儿(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个座席来计算,但总是不准确

1 个答案:

答案 0 :(得分: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 <- with(df, vresource(Calls, Duration, Wait_time, gos_target, 15)))来轻松地将其添加到数据框中。