分组滚动平均值

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

计算三个时期内两组观察到的数值变量的滚动平均值的解决方案是什么?

df <- data.frame(
  Day = c(1, 2, 3, 1, 2, 3),
  Id = c("A", "A", "A", "B", "B", "B"),
  Num = c(1, 2, 3, 1, 3, 9)
)

dplyr
解决方案很简单,但是在
base
中有没有明显的方法可以做到这一点?

library(dplyr)

df %>%
  group_by(Id) %>%
  mutate(RollingAvg = (Num + lag(Num))/2)
r
1个回答
1
投票

如果您不喜欢编写 whwt

dplyr::lag()
所做的包装器,您可以使用
embed()
。尝试一下

blag = \(x, k, fill = NA) c(rep(fill, k), head(x, -k))
within(df, { RollingAvg = ave(Num, Id, FUN = \(x) (x + blag(x, 1)) / 2) })

给予

  Day Id Num RollingAvg
1   1  A   1         NA
2   2  A   2        1.5
3   3  A   3        2.5
4   1  B   1         NA
5   2  B   3        2.0
6   3  B   9        6.0

注意。

within()
用于按原样生成输出。你也可以这样做

df$RollingAvg = with(df, ave(Num, Id, FUN = \(x) (x + blag(x, 1)) / 2))
© www.soinside.com 2019 - 2024. All rights reserved.