R条件滚动平均值

问题描述 投票:1回答:2
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值来计算平均值?

r dplyr data.table
2个回答
0
投票

第一次使用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])

0
投票

我们可以使用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]
© www.soinside.com 2019 - 2024. All rights reserved.