【问题标题】:Rolling average by time period rather than observation in R按时间段滚动平均,而不是在 R 中观察
【发布时间】:2015-12-14 02:47:27
【问题描述】:

我有一个日期随机发生的数据集。例如:

10/21/15、11/21/15、11/22/15、11/28/15、11/30/15、12/12/15...等

我希望按时间段而不是在观察级别创建滚动平均值。例如,如果我想做过去 7 天的移动平均线。我不想查看最后 7 行,而是查看最后 7

举个小例子:

 dates = c('2015-08-07', '2015-08-08','2015-08-09','2015-09-09','2015-10-10')
 value = c(5,10,5,3,2)
 df=data.frame(dates, value)
 df$desired = c(NA,5,7.5, NA,NA)

我显然希望为更大的数据集执行此操作,但我希望您明白这一点。例如,如果我使用 7 天,这就是我所期望的结果。

请注意,我没有将当前观察值包含到滚动平均值中,而只包含前一个值。我想要按时间段的滚动平均值,而不是观察行号。

我尝试查看 rollmean 和 dplyr,但无法弄清楚。不过,我真的不在乎它是如何发生的。

谢谢!

【问题讨论】:

  • 将流程拆分为多个部分:1. 聚合成周期,2. 加入所有周期的系列以使用 NA 填补数据中的潜在空白,3. 应用 rollmean

标签: r time time-series summary moving-average


【解决方案1】:

试试这个:

rollavgbyperiod <- function(i,window){
  startdate <- dates[i]-window
  enddate <- dates[i]-1
  interval <- seq(startdate,enddate,1)

  tmp <- value[dates %in% interval]
  return(mean(tmp))
}

dates <- as.Date(dates)
window <- 7
res <- sapply(1:length(dates),function(m) rollavgbyperiod(m,window))
res[is.nan(res)] <- NA

> data.frame(dates,value,res)
       dates value res
1 2015-08-07     5 NA
2 2015-08-08    10 5.0
3 2015-08-09     5 7.5
4 2015-09-09     3 NA
5 2015-10-10     2 NA

【讨论】:

  • 我有同样的需求/问题,但想使用一系列日期和值的动物园。有没有一种简单的方法可以将日历日期的滚动平均值与动物园对象一起使用?我发现的唯一方法是使用窗口函数来获取系列的一个子集,但我一直认为可能有更好的方法。
  • 是的,我认为你是对的。这会起作用,但您显然必须访问 zoo 对象的日期索引,而不是拥有单独的日期向量。但是,我还没试过。
【解决方案2】:

我建议在这种情况下使用runner 包。这里需要的是 mean_runk = 7 窗口,滞后 1 个周期。简单的单行:

library(runner)
dates = c('2015-08-07', '2015-08-08','2015-08-09','2015-09-09','2015-10-10')
value = c(5, 10, 5, 3, 2)

mean_run(x = value, k = 7, lag = 1, idx = as.Date(dates))
#[1]  NA 5.0 7.5  NA  NA

检查packagefunction 文档

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2021-08-09
    • 2023-03-08
    • 2015-04-14
    相关资源
    最近更新 更多