首页 > 解决方案 > 将季度数据转换为月度数据

问题描述

我得到了以下包含季度数据的数据表:

set.seed(1)
DT <- data.table(dates=c(as.Date("1983-03-31"), as.Date("1983-06-30"), as.Date("1983-09-30"), 
               as.Date("1983-12-31"), as.Date("1984-03-31"), as.Date("1984-06-30"),
               as.Date("1984-09-30"), as.Date("1984-12-31"), as.Date("1985-03-31"), 
               as.Date("1985-06-30"), as.Date("1985-09-30")),
       var=rnorm(11))
DT
# desired outout: (extract)
data.table(dates=c(as.Date("1983-01-31"), as.Date("1983-02-28"), as.Date("1983-03-31")),quarter=rep(as.Date("1983-03-31"),3), 
               var=rep(-0.6264538,3))

我想通过将相应月份的相应季度值复制 3 次,从季度数据集中创建一个月度数据集。必须首先创建相应的月份Date格式,因为它们应该稍后在分析中使用。这可以通过某种连接轻松完成吗?我只找到了反之亦然的方法,即通过聚合从每月到每季度。

最好通过使用datatable. 感谢您的任何提示。

标签: rdata.table

解决方案


这是一个 data.table 选项,其中包含一些 lubridate 函数。也许有更直接的方法,但这也可能完成这项工作:

library(lubridate)
DT <- DT[rep(1:.N, each = 3)]
DT[, quarter := dates]
DT[, dates := {day(dates) <- 1; dates}]
DT[, dates := {month(dates) <- month(dates) - 1:(-1); dates}, by = quarter]
DT[, dates := dates -1]

我们首先将每一行复制三次。然后我们为季度创建日期列的副本。接下来,我们将日期设置为该月的第一天。然后我们从每个日期中减去 1、0、-1 个月,最后减去一天,得出上个月的最后一天。

head(DT)
#       quarter        var      dates
# 1: 1983-03-31 -0.6264538 1983-01-31
# 2: 1983-03-31 -0.6264538 1983-02-28
# 3: 1983-03-31 -0.6264538 1983-03-31
# 4: 1983-06-30  0.1836433 1983-04-30
# 5: 1983-06-30  0.1836433 1983-05-31
# 6: 1983-06-30  0.1836433 1983-06-30

推荐阅读