我正在尝试计算不平衡数据集的滚动方式。为了说明我的观点,我制作了这个数据的玩具示例:
ID year Var RollingAvg(Var)
1 2000 2 NA
1 2001 3 2
1 2002 4 2.5
1 2003 2 3
2 2001 2 NA
2 2002 5 2
2 2003 4 3.5
列RollingAvg(Var)
是我想要的,但无法获得。换句话说,我正在寻找每个Var
的{{1}}所有先前观察的滚动平均值。我已尝试在ID
和rollapply
包中使用ddply
和zoo
,但我看不到如何设置滚动窗口长度以使用之前的观察结果对于每个ID。也许我应该使用plm包呢?任何帮助表示赞赏。
我在BALANCED面板数据集上看到了关于滚动方式的其他帖子,但我似乎无法推断他们对不平衡数据的回答。
谢谢,
M
答案 0 :(得分:7)
使用data.table
:
library(data.table)
d = data.table(your_df)
d[, RollingAvg := {avg = cumsum(Var)/seq_len(.N);
c(NA, avg[-length(avg)])},
by = ID]
(甚至简化)
d[, RollingAvg := c(NA, head(cumsum(Var)/(seq_len(.N)), -1)), by = ID]
答案 1 :(得分:2)
假设年份在每个ID中是连续的(在示例数据中是这种情况)并且DF
是输入数据帧,这里是仅使用基数R的解决方案。cumRoll
是一个函数对一个ID执行所需的操作,ave
然后按ID执行:
cumRoll <- function(x) c(NA, head(cumsum(x) / seq_along(x), -1))
DF$Roll <- ave(DF$Var, DF$ID, FUN = cumRoll)
结果是:
> DF
ID year Var Roll
1 1 2000 2 NA
2 1 2001 3 2.0
3 1 2002 4 2.5
4 1 2003 2 3.0
5 2 2001 2 NA
6 2 2002 5 2.0
7 2 2003 4 3.5