不平衡时间序列的滚动总和

时间:2012-01-20 21:16:06

标签: r time-series plyr

我有一系列每个类别的年度事件计数,多年来没有任何行,其中该类别没有发现事件。我想添加一个专栏,显示每年有多少事件发生在过去三年。

处理此问题的一种方法是在零事故中为所有年份添加空行,然后使用左对齐的四年窗口rollapply(),但这会扩展我的数据集超出我想要的范围。当然有一种方法可以使用ddply()transform吗?

以下两行代码构建一个虚拟数据集,然后按类别执行简单的plyr和:

dat <- data.frame(
   category=c(rep('A',6), rep('B',6), rep('C',6)), 
   year=rep(c(2000,2001,2004,2005,2009, 2010),3), 
   incidents=rpois(18, 3)
   )

ddply(dat, .(category) , transform, i_per_c=sum(incidents) )

虽然有效,但它只显示每个类别的总数。

我想要一年的总和。

所以我尝试使用ddply()语法扩展function()调用,如下所示:

ddply(dat, .(category) , transform, 
      function(x) i_per_c=sum(ifelse(x$year >= year - 4 & x$year < year,  x$incidents, 0) )
      )

这只返回原始数据框,未经修改。

我必须遗漏plyr语法中的内容,但我不知道它是什么。

谢谢, 马特

1 个答案:

答案 0 :(得分:3)

这很难看,但它确实有效。嵌套的ply调用:

ddply(dat, .(category), 
    function(datc) adply(datc, 1, 
         function(x) data.frame(run_incidents =
                                sum(subset(datc, year>(x$year-2) & year<=x$year)$incidents))))

可能有一种稍微更清晰的方法,并且肯定有更快的执行方式。