代码之家  ›  专栏  ›  技术社区  ›  89_Simple

R条件滚动平均

  •  1
  • 89_Simple  · 技术社区  · 6 年前
    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)) 
    

    对于每个身份证,我想做一个7年的滚动平均 y 从1998年开始。但是,条件是在每个滚动窗口中, 我只选择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值来计算平均值?

    编辑

    我也可以有这样的情况,一些身份证现在可能有至少7年的数据做移动平均,在这种情况下,上述功能将给我NAS。对于这些ID,是否可以简单地采用算术平均值?例如,如果一个id有1998-2002年的数据,在这种情况下,我可以简单地取 是的 1998-2002年

    2 回复  |  直到 6 年前
        1
  •  2
  •   Ronak Shah    6 年前

    我们可以利用 rollapplyr zoo 并应用自定义函数来计算 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]
    
        2
  •  0
  •   s_baldur    6 年前

    首次使用 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(mean(x[order(x, decreasing=TRUE)[1:5]]))