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年的数据,在这种情况下,我可以简单地取y
1998-2002年的平均值
我们可以使用rollapplyr
fromzoo
并应用自定义函数来计算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] 删除。
我来说两句