计算日期数量奇数的运行金额

问题描述 投票:0回答:1

我有一个充满技术支持票证日期和回复时间的表格,我想计算运行率以查找过去 n 天数的平均回复时间。数据格式如下。

日期 回复时间 票证号码
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

我可以通过计算平均回复时间每天,然后计算之前n天数的平均回复时间来解决这个问题,但这并没有考虑每天的观察数量,如果某些天存在异常值,结果就会出现偏差。当我进行平均时,我想考虑观察的数量,以防止异常值丢弃数据。

在这里,我使用包

runner
来获取平均回复时间每天,并从中计算移动平均值。

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
,以便嵌套正常工作;我认为有一种我不知道的跳过方法。无论如何,这会给我每个day的平均值186、321、0、412、0和131,所以当我使用
runner
时,我在2024年1月8日得到的移动平均值为175,而不是当您将所有数字相加并除以观测值数量时,预计会得到 227.83。

如果我跳过按每个日期分组,而是使用

complete
函数,则会收到一条错误消息,指出“'from' 必须是有限数字”。不使用
complete
并尝试使用
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
或通过其他软件包计算运行量时,有没有办法计算观察数量?

编辑:预期输出将包含每个日期的一行,以及过去 n 天的移动平均回复时间,这意味着输入和输出将具有不同的长度(金额不应与上表匹配,只是给定特定数据帧的预期输出的示例)。

日期 移动平均。回复时间
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
r date tidyverse runner
1个回答
0
投票

为此,我将使用

roll...
包中的
{zoo}
函数。

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_time
number_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

© www.soinside.com 2019 - 2024. All rights reserved.