2015-12-14 27 views
1

我有一个随机发生日期的数据集。例如:按时间段滚动平均值而非R中的观察值

15年10月21日,15年11月21日,15年11月22日,11个/ 28/15,11/30/15中,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,但我无法弄清楚。我不在乎它是如何发生的。

谢谢!

+1

分裂过程分成多个部分组成:1,聚合成段,2.加盟系列的所有时期,填补了与NA的,你的数据潜在的差距3.申请rollmean – jangorecki

回答

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 
+0

我有相同的需求/问题,但想使用动物园系列日期和值。有没有一种简单的方法来使用动物园对象的日历日期的滚动平均值?我发现的唯一方法是使用窗口函数来获取系列的一个子集,但我一直在想可能有更好的方法。 – Ernie

+0

@Ernie为什么这个解决方案不起作用? –

+0

是的,我认为你是对的。这将工作,但你显然必须访问动物园对象的日期索引,而不是有一个单独的日期向量。但是,我还没有尝试过。 – Ernie