【问题标题】:Convert quarterly data to monthly data将季度数据转换为月度数据
【发布时间】:2018-05-04 12:19:10
【问题描述】:

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

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。感谢您的任何提示。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    这是一个 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]
    

    我们首先将每一行复制 3 次。然后我们为季度创建日期列的副本。接下来,我们将日期设置为该月的第一天。然后我们从每个日期中减去 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
    

    【讨论】:

    • 感谢对我来说很好。如果有更直接的解决方案我当然也很感兴趣,但我认为这很棒。
    【解决方案2】:

    您可以枚举所需的日期并进行滚动连接:

    DT[.(seq(as.IDate("1983-02-01"), as.IDate("1985-10-01"), by="month") - 1L), 
      on=.(dates), roll=-Inf]
    
             dates        var
     1: 1983-01-31 -0.6264538
     2: 1983-02-28 -0.6264538
     3: 1983-03-31 -0.6264538
     4: 1983-04-30  0.1836433
     5: 1983-05-31  0.1836433
     6: 1983-06-30  0.1836433
     7: 1983-07-31 -0.8356286
     8: 1983-08-31 -0.8356286
     9: 1983-09-30 -0.8356286
    10: 1983-10-31  1.5952808
    11: 1983-11-30  1.5952808
    12: 1983-12-31  1.5952808
    13: 1984-01-31  0.3295078
    14: 1984-02-29  0.3295078
    15: 1984-03-31  0.3295078
    16: 1984-04-30 -0.8204684
    17: 1984-05-31 -0.8204684
    18: 1984-06-30 -0.8204684
    19: 1984-07-31  0.4874291
    20: 1984-08-31  0.4874291
    21: 1984-09-30  0.4874291
    22: 1984-10-31  0.7383247
    23: 1984-11-30  0.7383247
    24: 1984-12-31  0.7383247
    25: 1985-01-31  0.5757814
    26: 1985-02-28  0.5757814
    27: 1985-03-31  0.5757814
    28: 1985-04-30 -0.3053884
    29: 1985-05-31 -0.3053884
    30: 1985-06-30 -0.3053884
    31: 1985-07-31  1.5117812
    32: 1985-08-31  1.5117812
    33: 1985-09-30  1.5117812
             dates        var
    

    这将滚动到最近的较晚日期,因此如果您的原始数据有空白,则需要以不同方式处理它们(例如,先用 NA 填充)。

    【讨论】:

    • 感谢您提供的替代方法,效果很好(如果没有 NA)。
    猜你喜欢
    • 2020-08-28
    • 2021-10-14
    • 2019-12-06
    • 2022-11-10
    • 2021-03-08
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多