计算三个时期内两组观察到的数值变量的滚动平均值的解决方案是什么?
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)
如果您不喜欢编写 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))