按时间滚动平均而不是在R中观察

时间:2015-12-14 02:47:28

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

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

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,但我无法理解。我真的不在乎它是如何发生的。

谢谢!

2 个答案:

答案 0 :(得分:0)

试试这个:

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

答案 1 :(得分:0)

在这种情况下,我建议使用runner软件包。这里需要的是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

查看packagefunction文档