使用 dplyr 进行组降序滚动平均值

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

我需要计算 R dplyr 中按组 (group_by) 的滚动平均值的变化。

不同之处在于我想计算“降序”滚动平均值,这意味着滚动平均值包括每组列内的 1 到 N,然后 2 到 N,然后 3 到 N,最多 N 到 N 个数据点。

一个简单的例子:

the_df <- tibble(id=c(rep('x', 11),rep('y',11)), a=rep(10:0,2), b=rep(seq(100,0, ,by=-10),2))

the_df <- the_df %>% 
          group_by(id) %>% 
          mutate(lead_time = row_number(), 
                 inverse_lead_time = 11-lead_time)

the_df %>%
  arrange(id, (lead_time)) %>%
  group_by(id) %>%
  mutate_at(vars(a,b), list(run_avg = ~ zoo::rollmean(., lead_time, fill = NA, align='left')))

包含align='left',因此滚动平均值运行到组的末尾。

但是,我没有得到我期望的输出。

最后一条语句的输出是:

在这种情况下,我预计“a_run_avg”列会随着 Lead_time 的增加而增加。

重申一下,我想要的是在 Lead_time = 5 (例如)时,运行平均值是 a 列的平均值,以包含 Lead_time = 5 和 Lead_time = 10 之间的所有值 a。

lead_time=6 的滚动平均值将包括 Lead_time = 6 和 Lead_time = 10 之间的所有 a 值。

当 Lead_time = 1 时,a_run_avg 的值应为 5。它是该组 a 列中所有值的平均值。

当 Lead_time = 10 时,a_run_avg 的值应为 10。即,是只有一个值的滚动平均值。

如何修改示例代码以实现我的下降滚动平均值?

r dplyr zoo
1个回答
0
投票

rollmean 不接受向量宽度,但 rollapply 接受。

library(dplyr)
library(zoo)

the_df %>%
  mutate(across(any_of(c("a", "b")), 
    ~ rollapply(.x, n():1, mean, align = "left")), .by = id)
© www.soinside.com 2019 - 2024. All rights reserved.