【问题标题】:Rolling sum on an unbalanced time series不平衡时间序列上的滚动和
【发布时间】:2012-01-20 21:16:06
【问题描述】:

我有每个类别的一系列年度事件计数,没有针对该类别未发现事件的年份的行。我想添加一列,显示过去三年中每年发生的事件数量。

解决此问题的一种方法是为所有年份添加零事件的空行,然后将rollapply() 与左对齐的四年窗口一起使用,但这会使我的数据集扩展得超出我的预期。肯定有办法为此使用ddply()transform

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

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) )

这可行,但它只显示每个类别的总数。

我想要一个取决于年份的总数。

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

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

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

我一定是在plyr 语法中遗漏了一些东西,但我不知道它是什么。

谢谢, 马特

【问题讨论】:

    标签: r time-series plyr


    【解决方案1】:

    这有点难看,但它有效。嵌套层调用:

    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))))
    

    可能有一种更简洁的方法来执行此操作,并且肯定有一些执行速度更快的方法。

    【讨论】:

    • 哈兰,谢谢。看起来它可能会起作用,但qq 是在哪里分配的?
    • 糟糕,我的错。那里有一个来自测试的临时变量。固定。
    • 谢谢。这仍然是我想出的最佳解决方案。
    • 这里的想法很好,但它给出了错误的答案。新列不代表前三年的事件数,而是包含当年的事件数加上前两年的事件数。 (要最清楚地看到这一点,请将输出分配给d,然后使用d[order(d$category, d$year),] 进行排序。)
    • 乔希-你是对的。由于无论如何我都必须编辑 Harlan 的答案以适合我的真实数据,因此在此过程中修复算术并没有什么大不了的。双重transform() 是我正在寻找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多