我有一个表格,里面有技术支持票据的日期和回复时间,我想计算一个运行率,以找出过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

推荐答案

为此,我将使用{zoo}包中的roll...个函数.

library(dplyr)
library(zoo)

首先,让我们生成一些数据.一月的每一天最少出席一次.

set.seed(123)
january_dates <- seq(as.Date("2024-01-01"), length.out = 31, by = "day")
duplicate_dates <- sample(
  x = seq(as.Date("2024-01-01"), length.out = 31, by = "day"),
  size = 29,
  replace = TRUE
)

data <- data.frame(
  ticket_id = 1:60,
  date = c(january_dates, duplicate_dates),
  reply_time = sample(1:300, size = 60, replace = TRUE)
)

head(data)
#>   ticket_id       date reply_time
#> 1         1 2024-01-01        137
#> 2         2 2024-01-02        254
#> 3         3 2024-01-03        211
#> 4         4 2024-01-04         78
#> 5         5 2024-01-05         81
#> 6         6 2024-01-06         43

现在让我们按天计算total_reply_timenumber_of_tickets.

summary <- data |>
  arrange(date) |>
  summarise(
    total_reply_time = sum(reply_time),
    number_of_tickets = n(),
    .by = date
  )

最后一步是得到加权滚动平均值

summary |>
  mutate(
    rollsum_reply_time = zoo::rollsum(total_reply_time, k = 7, fill = NA, align = "right"),
    rollsum_tickerts = zoo::rollsum(number_of_tickets, k = 7, fill = NA, align = "right"),
    rolling_average = rollsum_reply_time / rollsum_tickerts
  )
#>          date total_reply_time number_of_tickets rollsum_reply_time
#> 1  2024-01-01              137                 1                 NA
#> 2  2024-01-02              254                 1                 NA
#> 3  2024-01-03              521                 3                 NA
#> 4  2024-01-04               78                 1                 NA
#> 5  2024-01-05              380                 3                 NA
#> 6  2024-01-06               43                 1                 NA
#> 7  2024-01-07              279                 2               1692
#> 8  2024-01-08              117                 2               1672
#> 9  2024-01-09              308                 2               1726
#> 10 2024-01-10              554                 3               1759
#> 11 2024-01-11               27                 2               1708
#> 12 2024-01-12              135                 1               1463
#> 13 2024-01-13              224                 1               1644
#> 14 2024-01-14              448                 3               1813
#> 15 2024-01-15              452                 2               2148
#> 16 2024-01-16              290                 1               2130
#> 17 2024-01-17               69                 1               1645
#> 18 2024-01-18              281                 2               1899
#> 19 2024-01-19              321                 3               2085
#> 20 2024-01-20              132                 2               1993
#> 21 2024-01-21              141                 1               1686
#> 22 2024-01-22              522                 3               1756
#> 23 2024-01-23              153                 1               1619
#> 24 2024-01-24              294                 1               1844
#> 25 2024-01-25              540                 4               2103
#> 26 2024-01-26              231                 3               2013
#> 27 2024-01-27              502                 3               2383
#> 28 2024-01-28              381                 2               2623
#> 29 2024-01-29               83                 2               2184
#> 30 2024-01-30              116                 1               2147
#> 31 2024-01-31              356                 2               2209
#>    rollsum_tickerts rolling_average
#> 1                NA              NA
#> 2                NA              NA
#> 3                NA              NA
#> 4                NA              NA
#> 5                NA              NA
#> 6                NA              NA
#> 7                12        141.0000
#> 8                13        128.6154
#> 9                14        123.2857
#> 10               14        125.6429
#> 11               15        113.8667
#> 12               13        112.5385
#> 13               13        126.4615
#> 14               14        129.5000
#> 15               14        153.4286
#> 16               13        163.8462
#> 17               11        149.5455
#> 18               11        172.6364
#> 19               13        160.3846
#> 20               14        142.3571
#> 21               12        140.5000
#> 22               13        135.0769
#> 23               13        124.5385
#> 24               13        141.8462
#> 25               15        140.2000
#> 26               15        134.2000
#> 27               16        148.9375
#> 28               17        154.2941
#> 29               16        136.5000
#> 30               16        134.1875
#> 31               17        129.9412

创建于2024—03—26,reprex v2.0.2

R相关问答推荐

列出用m n个值替换来绘制n个数字的所有方法(i.o.w.:R中大小为n的集合的所有划分为m个不同子集)

使用R的序列覆盖

使用R中的Shapetime裁剪格栅文件

如何使用R中的dhrr函数将李克特量表的因子列从长转换为宽?

从开始时间和结束时间导出时间

如何计算R数据集中每个女性的子元素数量?

如何删除gggvenn与gggplot绘制的空白?

移除仪表板Quarto中顶盖和车身之间的白色区域

从所有项的 struct 相同的两级列表中,将该第二级中的所有同名项绑定在一起

多个模拟序列间的一种预测回归关系

汇总数据的Sheffe检验的P值(平均值和标准差)

在使用具有Bray-Curtis相似性的pvCluust时计算p值

手动指定从相同数据创建的叠加图的 colored颜色

将摘要图添加到facet_WRAP gglot的末尾

如何根据未知数的多列排除重复行

如何在使用Alpha时让geom_curve在箭头中显示恒定透明度

R预测包如何处理ARIMA(Auto.arima函数)中的缺失值

使用dplyr删除具有条件的行

如何在GGPlot中控制多个图例和线型

如何使用包含要子集的值的列表或数据框来子集多个列?