【问题标题】:R : how to get the rolling mean of a variable over the last few days but only at a given hour?R:如何在过去几天但仅在给定时间获得变量的滚动平均值?
【发布时间】:2016-10-17 00:00:05
【问题描述】:

考虑一下

time <- seq(ymd_hms("2014-02-24 23:00:00"), ymd_hms("2014-06-25 08:32:00"), by="hour")
group <- rep(LETTERS[1:20], each = length(time))
value <- sample(-10^3:10^3,length(time), replace=TRUE)
df2 <- data.frame(time,group,value)
str(df2)

> head(df2)
                 time group value
1 2014-02-24 23:00:00     A   246
2 2014-02-25 00:00:00     A  -261
3 2014-02-25 01:00:00     A   628
4 2014-02-25 02:00:00     A   429
5 2014-02-25 03:00:00     A   -49
6 2014-02-25 04:00:00     A  -749

我想为每个组创建一个包含value

滚动平均值的变量
  • 过去 5 天(不包括当前观察)
  • 考虑与当前观测值完全相同的时间的观测值。

换句话说:

在时间2014-02-24 23:00:00df2['rolling_mean_same_hour'] 包含数据中过去 5 天在23:00:00 观察到的value 值的平均值(当然不包括2014-02-24)。

我想在dplyrdata.table 中这样做。我承认不知道该怎么做。

有什么想法吗?

非常感谢!

【问题讨论】:

    标签: r data.table dplyr lubridate


    【解决方案1】:

    您可以使用由group 变量和时间变量的hour 分组的数据来计算rollmean(),通常rollmean() 将包括当前观察值,但您可以使用shift() 函数来排除来自rollmean的当前观察:

    library(data.table); library(zoo)
    setDT(df2)
    df2[, .(rolling_mean_same_hour = shift(
                                           rollmean(value, 5, na.pad = TRUE, align = 'right'), 
                                           n = 1, 
                                           type = 'lag'), 
            time), .(hour(time), group)]
    
    #       hour group rolling_mean_same_hour                time
    #    1:   23     A                     NA 2014-02-24 23:00:00
    #    2:   23     A                     NA 2014-02-25 23:00:00
    #    3:   23     A                     NA 2014-02-26 23:00:00
    #    4:   23     A                     NA 2014-02-27 23:00:00
    #    5:   23     A                     NA 2014-02-28 23:00:00
    #   ---                                                      
    #57796:   22     T                 -267.0 2014-06-20 22:00:00
    #57797:   22     T                 -389.6 2014-06-21 22:00:00
    #57798:   22     T                 -311.6 2014-06-22 22:00:00
    #57799:   22     T                 -260.0 2014-06-23 22:00:00
    #57800:   22     T                  -26.8 2014-06-24 22:00:00
    

    【讨论】:

    • Fwiw,data.table 也有一个“一天中的时间”格式,ITime,所以如果 OP 将 var 放入该格式(两个 vars:IDate,ITime),他们可以分组那个。
    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 2021-07-01
    • 2021-12-02
    • 2012-06-03
    • 2020-09-05
    • 2021-08-03
    • 1970-01-01
    • 2019-10-05
    相关资源
    最近更新 更多