R:如何获得变量在过去几天但仅在给定时间的滚动平均值?
R : how to get the rolling mean of a variable over the last few days but only at a given hour?
考虑一下
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:00
,df2['rolling_mean_same_hour']
包含数据中过去 5 天在 23:00:00
观察到的 value
值的平均值(不包括 2014-02-24
当然)。
我想在 dplyr
或 data.table
中这样做。我承认我不知道该怎么做。
有什么想法吗?
非常感谢!
您可以使用按 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
考虑一下
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:00
,df2['rolling_mean_same_hour']
包含数据中过去 5 天在 23:00:00
观察到的 value
值的平均值(不包括 2014-02-24
当然)。
我想在 dplyr
或 data.table
中这样做。我承认我不知道该怎么做。
有什么想法吗?
非常感谢!
您可以使用按 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