【问题标题】:Aggregate monthly data in triannual (four-month) periods in R在 R 中聚合每三年(四个月)期间的月度数据
【发布时间】:2015-08-06 07:50:22
【问题描述】:

我有一些每月销售数据x,我想按四个月的时间段汇总它。当我对季度数据 aggregate(x, nfrequency = 4, FUN = sum) 使用聚合时,我得到一个很好的表,其中列名 Qtr1Qtr2Qtr3Qtr4 和年份作为行名。但是,当我将频率更改为 nfrequency = 3 时,我只得到一个包含正确值的列表,而不是漂亮的表。有没有一种聪明的方法来获得一个与季度类似但具有这个三年期值的表格?

Data:

        Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct    Nov    Dec
2006 279.95 299.61 442.00 409.94 410.50 403.63 408.54 336.47 378.93 388.13 319.38 377.63
2007 343.37 343.09 450.52 360.06 373.00 497.27 370.10 430.72 313.88 328.64 383.43 214.27
2008 346.37 281.68 325.14 317.50 320.07 375.60 449.38 322.88 231.23 262.45 268.53 187.59
2009 261.36 225.25 299.97 312.90 351.44 298.00 332.04 271.91 183.07 246.60 260.59 127.01
2010 175.45 164.04 313.62 320.35 323.61 344.62 271.85 284.24 230.13 232.94 192.12 112.46
2011 167.15 187.44 178.87 318.83 251.52 230.51 232.49 155.83 180.65 167.19 118.87 137.40
2012 124.81 127.35 172.95 140.92 171.47 208.92 133.56 130.90 119.06  93.34  78.76  79.08
2013  97.49  98.65 117.95 142.32 138.32 118.60 147.08  88.17  91.56 115.47 114.35 100.48
2014  79.54 100.24 120.39 147.05 175.03 114.21 167.29 113.88  94.42 110.28  99.19  65.33
2015 79.44 114.24 144.33 173.30 151.79 142.02

【问题讨论】:

标签: r time-series aggregate forecasting


【解决方案1】:

最后,我找到了这个解决方案。

library(lubridate)
library(plyr)
library(reshape2)
cuatrimestre<-ifelse(cycle(data) %in% c(1:4), 1, ifelse(cycle(data) %in%    c(5:8), 2, 3))
year<-as.numeric(substring(time(data), first=1, last=4))
data.cuatrimestre<-as.data.frame(cbind(data, cuatrimestre, year))
data.por.cuatrimestres<-aggregate(data~year+cuatrimestre, data.cuatrimestre, function(x) c(sum=sum(x))) 
dcast(data.por.cuatrimestres, year~cuatrimestre, sum)

但是,这肯定是一种更有效的方法。有人可以帮忙吗?

【讨论】:

    【解决方案2】:

    使用data.table,这可以在两行代码中完成:

    library(data.table)
    
    cm <- data.table(year = as.integer(time(x)), part = (cycle(x) - 1L) %/% 4 + 1L, x)
    dcast(cm[, .(sum = sum(x)), keyby = "year,part"], year ~ part)
    
        year       1       2       3
     1: 2006 1431.50 1559.14 1464.07
     2: 2007 1497.04 1671.09 1240.22
     3: 2008 1270.69 1467.93  949.80
     4: 2009 1099.48 1253.39  817.27
     5: 2010  973.46 1224.32  767.65
     6: 2011  852.29  870.35  604.11
     7: 2012  566.03  644.85  370.24
     8: 2013  456.41  492.17  421.86
     9: 2014  447.22  570.41  369.22
    10: 2015  511.31  293.81      NA
    

    说明

    • 第一行从数据x 创建一个data.table,它属于ts 类。 (不幸的是,OP 忘记在 Q 中传达这个事实。)

    • 在计算年份的part 时,除法器4 给出了该期间的月份数。将此值更改为 3 用于季度结果(3 个月期间)或 6 用于半年结果(6 个月期间)。

    • 第二行计算按年份yearpart 分组的聚合,然后使用 dcast 将结果从长格式转换为宽格式。

    数据

    为了使该解决方案具有可重复性,必须提供数据。不幸的是,OP 没有提供数据的dput,而是提供了一个表格,该表格是将x 作为ts 对象打印的结果。

    使用data.table 中包含的通用fread 函数读取(稍作修改)表(使用开发版本1.9.7)。然后将其从宽格式转换为长格式(melt),给出一个向量。经过一些日期计算和排序,最终创建了类ts 的时间序列。

    library(data.table)
    dt <- fread("year        Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct    Nov    Dec
          2006 279.95 299.61 442.00 409.94 410.50 403.63 408.54 336.47 378.93 388.13 319.38 377.63
          2007 343.37 343.09 450.52 360.06 373.00 497.27 370.10 430.72 313.88 328.64 383.43 214.27
          2008 346.37 281.68 325.14 317.50 320.07 375.60 449.38 322.88 231.23 262.45 268.53 187.59
          2009 261.36 225.25 299.97 312.90 351.44 298.00 332.04 271.91 183.07 246.60 260.59 127.01
          2010 175.45 164.04 313.62 320.35 323.61 344.62 271.85 284.24 230.13 232.94 192.12 112.46
          2011 167.15 187.44 178.87 318.83 251.52 230.51 232.49 155.83 180.65 167.19 118.87 137.40
          2012 124.81 127.35 172.95 140.92 171.47 208.92 133.56 130.90 119.06  93.34  78.76  79.08
          2013  97.49  98.65 117.95 142.32 138.32 118.60 147.08  88.17  91.56 115.47 114.35 100.48
          2014  79.54 100.24 120.39 147.05 175.03 114.21 167.29 113.88  94.42 110.28  99.19  65.33
          2015 79.44 114.24 144.33 173.30 151.79 142.02 NA NA NA NA NA NA")
    
    mdt <- melt(dt, id.vars = "year")[, dates := lubridate::ymd(paste(year, variable, "01"))]
    x <- ts(mdt[order(dates)][!is.na(value), value], start = c(2006L, 1L), frequency = 12)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      相关资源
      最近更新 更多