条件滚动平均值

89_Simple
library(data.table)

set.seed(123)
d <- data.frame(ID = rep(1:5, each = 17), yearRef = rep(1998:2014, times = 5), y = sample(1:100, 17 * 5)) 

对于每个ID,我希望y从1998年开始做7年的滚动平均值但是,条件是,在每个滚动窗口中,我仅选择y的前5个最高值进行平均值。例如

第一个滚动窗口是

1998-2004年-仅对前5个最高“ y”值进行平均

1999-2005年-仅对前5个最高的“ y”值进行平均。

2007-2013年-仅对前5个最高“ y”值进行平均

2008-2014年-仅对前5个最高“ y”值进行平均

我对使用data.table实现这一目标很感兴趣。但是也欢迎其他建议。这是我尝试过的

 d = setDT(d)
 d[, avg.Y := frollmean(y, 7), by = ID]

如何输入另一个自变量,在每个滚动7年窗口中,我仅选择前5个最高y值来计算均值?

编辑

我还可能会遇到这样的情况,即某些ID可能没有最少7年的数据来做移动平均值,在这种情况下,上述功能会给我NA。对于这些ID,是否可以简单地采用算术平均值?例如,如果一个ID具有1998-2002年的数据,在这种情况下,我可以简单地取y1998-2002年的平均值

罗纳克·沙

我们可以使用rollapplyrfromzoo并应用自定义函数来计算mean每个滚动窗口中的前5个值。

library(data.table)
library(zoo)

setDT(d)
d[, avg.Y:= rollapplyr(y, 7,function(x) mean(tail(sort(x), 5)), fill = NA), by = ID]

对于观察数量可能少于窗口大小的情况,我们可以做

d[, avg.Y:= if (.N > 6) 
            rollapplyr(y, 7,function(x) mean(tail(sort(x), 5)), fill = NA)  
            else mean(y), by = ID]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章