Я пытаюсь применить функцию к фрейму данных, используя sapply. Функция - это вычисление Erlang C, которое я нашел на одном из сайтов, с которыми я столкнулся во время исследования. У меня проблемы с тем, как включить имена строк, связанные с выводом. Я хотел бы, чтобы результат включал имена строк из "wkday" и "grpnum" из примера ниже. Я пробовал образцы, которые видел, но не повезло.
thank you in advance
пример данных с кодом:
wkday <-c("Mon","Tue","Wed","Thur","Fri","Sat","Sun","Sat","Mon")
grpnum <-c(2,2,1,3,5,4,8,9,6)
p1 <- c(1,5,6,15,15,6,2,10,35)
p2 <- c(2,3,4,5,8,25,7,20,3)
testdf <- data.frame(wkday,grpnum,p1,p2)
## Erlang Calculation ##
dur = 600
tgt = 300
gostgt = 75
intensity <- function(rate, duration = dur, 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 = dur, target = tgt, gos_target =
gostgt, 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(agents)
}
m1 <- as.matrix(sapply(p1,resource))
m2 <- as.matrix(sapply(p2,resource))
cbind(m1,m2)
current output:
[,1] [,2]
[1,] 1 1
[2,] 2 2
[3,] 2 2
[4,] 4 2
[5,] 4 3
[6,] 2 6
[7,] 1 3
[8,] 3 5
[9,] 8 2
desired output:
[,1] [,2]
Mon 1 1
Tue 2 2
Wed 2 2
Thur 4 2
Fri 4 3
Sat 2 6
Sun 1 3
Sat 3 5
Mon 8 2