【问题标题】:How to include annual data in a monthly dataset如何在月度数据集中包含年度数据
【发布时间】:2020-01-07 05:40:34
【问题描述】:

我正在尝试将年度公司数据添加到月度数据中。由于年度数据是在特定月份报告的,并不总是每 12 个月更新一次,因此我需要年度值与月度数据集中的月份相匹配,然后将它们延续到该特定公司的下一个可用数据点(如果有的话)。

该数据集包含数千家具有唯一 ID 的公司,这些公司通常不会以相同的年度模式进行报告。随后的两个 ReportMonth 不必在同一个月份。此外,可能有几年我没有 ReportMonth,因此没有那一年的年度数据。

我确保在我有一些年度数据的每个月中,整行年度变量永远不会是 NA。下面是一个结构示例,以及我现在遇到的问题。

        id     Date  MonVariable  ReportMonth  AnnVariable
1  ABCDEFG  1999-02            1         <NA>         <NA>
2  ABCDEFG  1999-01            2         <NA>         <NA>
3  ABCDEFG  1998-12            3         <NA>         <NA>
4  HIJKLMN  2019-08            4         <NA>         <NA>
5  HIJKLMN  2019-07            5         <NA>         <NA>
6  HIJKLMN  2019-06            6         <NA>         <NA>
7  HIJKLMN  2019-05            7      2019-05          101
8  HIJKLMN  2019-04            8      2018-06          113

我尝试对每个年度变量使用dplyr:group_by(id),然后使用zoo:na.locf(x, na.rm = F, fromLast = T, maxgap = 12)

我最多可以将它们保留 12 个月,这可以在第 8 行中看到,其中年度变量来自大约一年前的报告日期。

但是有两个问题。第一个是从一家公司到另一家公司的中断前后,仍然缺少以下公司的最新值(第 4-6 行)。但是,我也想为它们提供最后一个可用的值,如下所示。

        id     Date  MonVariable  ReportMonth  AnnVariable
1  ABCDEFG  1999-02            1         <NA>         <NA>
2  ABCDEFG  1999-01            2         <NA>         <NA>
3  ABCDEFG  1998-12            3         <NA>         <NA>
4  HIJKLMN  2019-08            4      2019-05          101
5  HIJKLMN  2019-07            5      2019-05          101
6  HIJKLMN  2019-06            6      2019-05          101
7  HIJKLMN  2019-05            7      2019-05          101
8  HIJKLMN  2019-04            8      2018-06          113

我认为na.locf 直到休息才填补它们,因为公司的最后一个年度变量也经常丢失,因此最接近的 2 个值的行之间的“差距”大于 12(我猜dplyr 分组无法按照我目前理解的方式工作)。

第二个问题是,当某家特定公司的年度报告值之间的差距大于 12 个月时。 na.locf 也没有填充任何东西,因为差距大于maxgap。在这种情况下,我想将最后一个可用值结转到接下来的 12 个月,如下所示。

         id     Date  MonVariable  ReportMonth  AnnVariable
 1  HIJKLMN  2019-08            1      2019-08          149
 2  HIJKLMN  2019-07            2         <NA>         <NA>
 3  HIJKLMN  2019-06            3         <NA>         <NA>
 4  HIJKLMN  2019-05            4      2018-05          101
 5  HIJKLMN  2019-04            5      2018-05          101
 6  HIJKLMN  2019-03            6      2018-05          101
 7  HIJKLMN  2019-02            7      2018-05          101
 8  HIJKLMN  2019-01            8      2018-05          101
 9  HIJKLMN  2018-12            9      2018-05          101
10  HIJKLMN  2018-11            1      2018-05          101
11  HIJKLMN  2018-10            2      2018-05          101
12  HIJKLMN  2018-09            3      2018-05          101
13  HIJKLMN  2018-08            4      2018-05          101
14  HIJKLMN  2018-07            5      2018-05          101
15  HIJKLMN  2018-06            6      2018-05          101
16  HIJKLMN  2018-05            7      2018-05          101
17  HIJKLMN  2018-04            8      2017-06          113

感谢您的帮助!!

【问题讨论】:

    标签: r database time-series na zoo


    【解决方案1】:

    您可以使用by 将数据拆分为ID,然后将substring 设置为out of year 和"05" 月份。如果可用,请与 ifelse 检查,如果不可用,请分配 NA。对于"AnnVariable",我们可以使用已排序的"AnnVariable" 作为标签从"ReportMonth" 中提取一个因子(应按比例放大到您的数据,但请仔细检查,例如,如果"AnnVariable" 已按照您的示例所示进行排序)。

    df1 <- within(df1, {
      ReportMonth <- do.call(c, by(df1, df1$id, function(s) {
        r <- ifelse(as.numeric(substring(s$Date, 6)) >= 5, 
                    paste0(substr(s$Date, 1, 4), "-05"),
                    paste0(as.numeric(substr(s$Date, 1, 4)) - 1, "-05"))
        return(ifelse(r %in% s$ReportMonth, r, NA))
      }))
      AnnVariable <- factor(ReportMonth, labels=sort(as.numeric(na.omit(AnnVariable))))
    })
    df1
    #        id    Date MonVariable ReportMonth AnnVariable
    # 1 ABCDEFG 1999-02           1        <NA>        <NA>
    # 2 ABCDEFG 1999-01           2        <NA>        <NA>
    # 3 ABCDEFG 1998-12           3        <NA>        <NA>
    # 4 HIJKLMN 2019-08           4     2019-05         100
    # 5 HIJKLMN 2019-07           5     2019-05         100
    # 6 HIJKLMN 2019-06           6     2019-05         100
    # 7 HIJKLMN 2019-05           7     2019-05         100
    # 8 HIJKLMN 2019-04           8     2018-05          90
    

    编辑

    如果时间变化更复杂,您可以查看 cut 将日期转换为 numerics。

    df1[8, 4] <- "2018-06"
    
    # helping variables
    df1$Date.num <- as.numeric(gsub("\\D", "", df1$Date))
    df1$ReportMonth.num <- as.numeric(gsub("\\D", "", df1$ReportMonth))
    
    df1 <- within(df1, {
      ReportMonth <- do.call(c, by(df1, df1$id, function(s) {
        n <- rev(na.omit(s$ReportMonth))
        res <- cut(s$Date.num, c(gsub("\\D", "", n), range(s$Date.num)), labels=c(n, n[2]))
        return(as.character(res))
      }))
      AnnVariable <- factor(ReportMonth, labels=sort(as.numeric(na.omit(AnnVariable))))
    })[1:5]
    #        id    Date MonVariable ReportMonth AnnVariable
    # 1 ABCDEFG 1999-02           1        <NA>        <NA>
    # 2 ABCDEFG 1999-01           2        <NA>        <NA>
    # 3 ABCDEFG 1998-12           3        <NA>        <NA>
    # 4 HIJKLMN 2019-08           4     2019-05         100
    # 5 HIJKLMN 2019-07           5     2019-05         100
    # 6 HIJKLMN 2019-06           6     2019-05         100
    # 7 HIJKLMN 2019-05           7     2019-05         100
    # 8 HIJKLMN 2019-04           8     2018-06          90
    

    数据

    df1 <- structure(list(id = c("ABCDEFG", "ABCDEFG", "ABCDEFG", "HIJKLMN", 
    "HIJKLMN", "HIJKLMN", "HIJKLMN", "HIJKLMN"), Date = c("1999-02", 
    "1999-01", "1998-12", "2019-08", "2019-07", "2019-06", "2019-05", 
    "2019-04"), MonVariable = 1:8, ReportMonth = c(NA, NA, NA, NA, 
    NA, NA, "2019-05", "2018-05"), AnnVariable = c(NA, NA, NA, NA, 
    NA, NA, "100", "90")), row.names = c(NA, -8L), class = "data.frame")
    

    【讨论】:

    • 感谢您的回答!这里的一个问题是 ReportMonth 并不总是相同的(我在问题中编辑了我的示例以反映这一点)。有没有办法修改您的方法以使其更通用?此外,要使用您的因子方法,是否可以在“by”内创建 ReportMonth 因子,因为 ReportMonth 在整个数据集中不是唯一的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2015-11-01
    • 2021-03-08
    • 1970-01-01
    • 2021-10-14
    • 2021-01-24
    • 2020-11-16
    • 1970-01-01
    相关资源
    最近更新 更多