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,我希望从1998年开始对y
进行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值来计算平均值?
第一次使用frollapply()
,但这似乎起作用:
get_mean_top5 <- function(x) mean(-sort(-x, partial = 1:5)[1:5])
d[, test := frollapply(y, 7, FUN = get_mean_top5), by = ID]
函数get_mean_top5()
过滤出前5个最高值,然后取平均值。其他更具可读性的形式是:
get_mean_top5 <- function(x) mean(x[order(x, decreasing = TRUE)][1:5])
我们可以使用rollapply
中的zoo
并应用自定义功能
library(data.table)
library(zoo)
setDT(d)
d[, avg.Y := rollapplyr(y, 7, function(x) mean(tail(sort(x), 5)), fill = NA), by = ID]