我有一个表格,里面有技术支持票据的日期和回复时间,我想计算一个运行率,以找出过go n天的平均回复时间.数据格式如下.
Dates | Reply Time | Ticket ID |
---|---|---|
2024-01-02 | 341 | 1 |
2024-01-02 | 31 | 2 |
2024-01-03 | 321 | 3 |
2024-01-05 | 412 | 4 |
2024-01-07 | 93 | 5 |
2024-01-07 | 169 | 6 |
我可以通过计算平均回复时间each day,然后计算前n天的平均回复时间来解决这个问题,但这没有考虑每天的观察次数,如果某些日子有异常值,这将扭曲结果.当我计算平均值时,我想考虑到观测值的数量,以防止异常值丢弃数据.
这里,我使用包runner
来获得平均回复时间each day,并由此计算移动平均值.
daily_reply_time <- df_replies %>%
filter(!is.na(reply_time) & !is.na(dates)) %>%
group_by(dates) %>%
reframe(avg_reply_time = mean(reply_time, na.rm = TRUE)) %>%
mutate(
x = "x",
dates = lubridate::ymd(dates)
) %>%
filter(!is.na(dates)) %>%
complete(
nesting(x),
dates = seq(min(dates), max(dates), by = "day")
) %>%
group_by(x) %>%
arrange(dates) %>%
mutate(
dates= lubridate::ymd(dates),
avg_reply_time = ifelse(is.na(avg_reply_time), 0, as.numeric(avg_reply_time )),
running_reply_time_30_days = runner::mean_run(x = avg_reply_time, k = 30, idx = dates)
) %>%
select(-x)
我创建了一个伪变量x
,以便嵌套正常工作;我假设有一种方法可以跳过,但我不知道.无论如何,这将给我的平均值为186,321,0,412,0和131,所以当我使用runner
时,我得到了2024—01—08的移动平均值为175,而不是当你只是求和所有数字并除以观察次数时所期望的227.83.
如果我跳过按每个日期分组,而使用complete
函数,我会得到一个错误,说"'from'必须是一个有限的数字."不使用complete
并try 使用runner
包不会引发错误,而是数据集中前n行的平均值,而不是日期数.
daily_reply_time <- df_replies %>%
filter(created_at > '2023-12-31') %>%
mutate(
created_at = substr(created_at, 1, 10),
first_reply_time_in_minutes = first_reply_time_in_minutes / 60
) %>%
filter(!is.na(created_at) & !is.na(first_reply_time_in_minutes)) %>%
mutate(x = "x") %>%
complete(
nesting(x),
created_at = seq(min(created_at), max(created_at), by = "day")
)
当使用runner
或通过其他软件包计算运行量时,是否有方法可以考虑观察次数?
编辑:预期输出将包含每个日期的一行,以及过go n天的移动平均回复时间,这意味着输入和输出将具有不同的长度(数量不应该与上表相匹配,只是给定特定日历的预期输出的示例).
Dates | Moving Avg. Reply Time |
---|---|
2024-01-02 | 125 |
2024-01-03 | 108.3 |
2024-01-04 | 108.3 |
2024-01-05 | 137 |
2024-01-06 | 67 |
2024-01-07 | 251 |