按时间段(而非R中的观察值)滚动平均

按时间段(而非R中的观察值)滚动平均,r,time,time-series,summary,moving-average,R,Time,Time Series,Summary,Moving Average,我有一个日期随机出现的数据集。例如: 15年10月21日、15年11月21日、15年11月22日、15年11月28日、15年11月30日、15年12月12日……等等 我希望在观察层面上创建一个按时间段而不是按时间段的滚动平均值。例如,如果我想做过去7天的移动平均线。我不想看最后7行,而是看最后7天 举个小例子: dates = c('2015-08-07', '2015-08-08','2015-08-09','2015-09-09','2015-10-10') value = c(5,10

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

15年10月21日、15年11月21日、15年11月22日、15年11月28日、15年11月30日、15年12月12日……等等

我希望在观察层面上创建一个按时间段而不是按时间段的滚动平均值。例如,如果我想做过去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,但我想不出来。不过,我真的不在乎它是怎么发生的

谢谢

试试这个:

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
rollavgbyperiod我建议在这种情况下使用package。这里需要的是
mean_run
k=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

检查和记录

将流程分为多个部分:1。聚合成周期,2。加入所有时段系列,用NA 3填补数据中的潜在空白。应用RollMean我有同样的需求/问题,但希望使用一系列日期和值。有没有一种简单的方法可以将日历日期的滚动平均值用于zoo对象?我发现的唯一方法是使用窗口函数获取序列的子集,但我一直认为可能有更好的方法。是的,我认为你是对的。这会起作用,但显然您必须访问zoo对象的日期索引,而不是单独的日期向量。但是,我还没有试过。