如何以季度频率汇总data.table?

时间:2016-07-12 17:27:48

标签: r date data.table aggregate frequency

我的数据按每月频率提供,我正在尝试按季度汇总它们。我正在使用data.table哪个包我不太了解,说实话。

   X.DATA_BASE                                             NOME_INSTITUICAO     SALDO.x    SALDO.y
1:      199407 ASB S/A - CFI                                                    1694581    1124580
2:      199407 BANCO ARAUCARIA S.A.                                            40079517    6314782
3:      199407 BANCO ATLANTIS S.A.                                            200463907    9356445
4:      199407 BANCO BANKPAR                                                    1078342    5770046
5:      199407 BANCO BBI                                                       97812975   31112289                                                                                            

对于每个日期,由X.DATA_BASE,199407 = 1994年7月定义。我有几个机构的SALDO.x和SALDO.y值。我想在每个季度为每个机构添加SALDO.x和SALDO.y。其中一个问题是一些机构进入并离开了。在一天结束的时候,我希望mydata具有相同的列但频率为季度。

我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

以下是一个如何按季度分组和总结的示例(感谢@eddi建议的改进)。首先让我们创建一些假日期:

library(data.table)

set.seed(1485)
dat = data.table(date=rep(c(199401:199412,199501:199512),2),
             firm=rep(c("A","B"), each=24),
             value1=rnorm(48,1000,10),
             value2=rnorm(48,2000,100))

dat
      date firm    value1   value2
 1: 199401    A 1009.8620 2054.251
 2: 199402    A 1009.7180 2124.202
 3: 199403    A 1014.3421 1919.251
...
46: 199510    B  992.9961 2079.517
47: 199511    B  997.9147 1968.676
48: 199512    B 1002.5993 2006.231

现在,按公司,年份和季度汇总。为此,我们从year创建quarterdate分组变量(我们使用整数除法(%/%)来创建年份和mod(%%)加上整数除法来创建四分之一),并为每个子组计算value1value2的总和。这一切都假设date是数字。如果您将其存储为字符或因子,请先转换为数字:

dat.summary = dat[ , list(valueByQuarter = sum(sum(value1) + sum(value2))), 
              by=list(firm, 
                      year=date %/% 100, 
                      quarter=(date %% 100 - 1) %/% 3 + 1)]

dat.summary
    firm year quarter valueByQuarter
 1:    A 1994       1       9131.626
 2:    A 1994       2       8953.116
 3:    A 1994       3       8981.407
 4:    A 1994       4       9175.959
 5:    A 1995       1       9003.225
 6:    A 1995       2       8962.690
 7:    A 1995       3       8809.256
 8:    A 1995       4       8885.264
 9:    B 1994       1       9000.791
10:    B 1994       2       8936.356
11:    B 1994       3       8905.789
12:    B 1994       4       8951.369
13:    B 1995       1       8922.716
14:    B 1995       2       9097.134
15:    B 1995       3       8724.188
16:    B 1995       4       9047.934

对于dplyr粉丝,这是dplyr方法:

library(dplyr)

dat %>% 
  group_by(firm, year=date %/% 100, 
           quarter=(date %% 100 - 1) %/% 3 + 1) %>%
  summarise(valueByQuarter = sum(value1 + value2))