我需要计算 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。即,是只有一个值的滚动平均值。
如何修改示例代码以实现我的下降滚动平均值?
rollmean 不接受向量宽度,但 rollapply 接受。
library(dplyr)
library(zoo)
the_df %>%
mutate(across(any_of(c("a", "b")),
~ rollapply(.x, n():1, mean, align = "left")), .by = id)