【问题标题】:Merge Panel data to get balanced panel data合并面板数据以获得平衡的面板数据
【发布时间】:2016-06-07 05:52:13
【问题描述】:

我有几个面板数据形式的数据框。现在我想将这些面板数据框合并为一个面板数据。这些数据帧之间有共同点和不同点。我说明如下:

df1:

Month   variable    Beta1   Beta2   Beta3   Beta4   Beta5   Beta6
Jan-05     A        1       2       3       4       5       6
Feb-05     A        2       3       4       5       6       7
Mar-05     A        3       4       5       6       7       8
Apr-05     A        4       5       6       7       8       9
May-05     A        5       6       7       8       9       10
Jun-05     A        6       7       8       9      10       11
Jul-05     A        7       8       9       10     11       12
Aug-05     A        8       9       10      11     12       13
Sep-05     A        9       10      11      12     13       14
Oct-05     A       10       11      12      13     14       15
Nov-05     A       11       12      13      14     15       16
Dec-05     A       12       13      14      15     16       17
Jan-05     B       12       12      12      12     12       12
Feb-05     B       12       12      12      12     12       12
Mar-05     B       12       12      12      12     12       12
Apr-05     B       12       12      12      12     12       12
May-05     B       12       12      12      12     12       12
Jun-05     B       12       12      12      12     12       12
Jul-05     B       12       12      12      12     12       12
Aug-05     B       12       12      12      12     12       12
Sep-05     B       12       12      12      12     12       12
Oct-05     B       12       12      12      12     12       12
Nov-05     B       12       12      12      12     12       12
Dec-05     B       12       12      12      12     12       12

df2:

Month   variable    Beta1   Beta2   Beta3   Beta4   Beta5   Beta6
Jan-06     A        1       2       3       4       5       6
Feb-06     A        2       3       4       5       6       7
Mar-06     A        3       4       5       6       7       8
Apr-06     A        4       5       6       7       8       9
May-06     A        5       6       7       8       9       10
Jun-06     A        6       7       8       9      10       11
Jul-06     A        7       8       9       10     11       12
Aug-06     A        8       9       10      11     12       13
Sep-06     A        9       10      11      12     13       14
Oct-06     A       10       11      12      13     14       15
Nov-06     A       11       12      13      14     15       16
Dec-06     A       12       13      14      15     16       17
Jan-06     C       12       12      12      12     12       12
Feb-06     C       12       12      12      12     12       12
Mar-06     C       12       12      12      12     12       12
Apr-06     C       12       12      12      12     12       12
May-06     C       12       12      12      12     12       12
Jun-06     C       12       12      12      12     12       12
Jul-06     C       12       12      12      12     12       12
Aug-06     C       12       12      12      12     12       12
Sep-06     C       12       12      12      12     12       12
Oct-05     C       12       12      12      12     12       12
Nov-05     C       12       12      12      12     12       12
Dec-05     C       12       12      12      12     12       12

所需的输出如下,我想合并面板数据框,使每个变量长期排列,如果数据无法使用一年,那么它在 Beta1、Beta2 等下具有 NA。

 Month  variable    Beta1   Beta2   Beta3   Beta4   Beta5   Beta6
Jan-05    A            1    2       3       4       5        6
Feb-05    A            2    3       4       5       6        7
Mar-05    A            3    4       5       6       7        8
Apr-05    A            4    5       6       7       8        9
May-05    A            5    6       7       8       9       10
Jun-05    A            6    7       8       9       10      11
Jul-05    A            7    8       9       10      11      12
Aug-05    A            8    9       10      11      12      13
Sep-05    A            9    10      11      12      13      14
Oct-05    A            10   11      12      13      14      15
Nov-05    A            11   12      13      14      15      16
Dec-05    A            12   13      14      15      16      17
Jan-06    A            1    2        3       4       5      6
Feb-06    A            2    3        4       5       6      7
Mar-06    A            3    4        5       6       7      8
Apr-06    A            4    5        6       7       8      9
May-06    A            5    6        7       8       9     10
Jun-06    A            6    7        8       9       10    11
Jul-06    A            7    8        9      10       11    12
Aug-06    A            8    9        10     11       12    13
Sep-06    A            9    10       11     12       13    14
Oct-06    A           10    11      12      13       14    15
Nov-06    A           11    12      13      14       15    16
Dec-06    A           12    13      14      15       16    17
Jan-05    B           12    12      12      12       12    12
Feb-05    B           12    12      12      12       12    12
Mar-05    B           12    12      12      12       12    12
Apr-05    B           12    12      12      12       12    12
May-05    B           12    12      12      12       12    12
Jun-05    B           12    12      12      12       12    12
Jul-05    B           12    12      12      12       12    12
Aug-05    B           12    12      12      12       12    12
Sep-05    B           12    12      12      12       12    12
Oct-05    B           12    12      12      12       12    12
Nov-05    B           12    12      12      12       12    12
Dec-05    B           12    12      12      12       12    12
Jan-06    B           NA    NA      NA      NA       NA    NA
Feb-06    B           NA    NA      NA      NA       NA    NA
Mar-06    B           NA    NA      NA      NA       NA    NA
Apr-06    B           NA    NA      NA      NA       NA    NA
May-06    B           NA    NA      NA      NA       NA    NA
Jun-06    B           NA    NA      NA      NA       NA    NA
Jul-06    B           NA    NA      NA      NA       NA    NA
Aug-06    B           NA    NA      NA      NA       NA    NA
Sep-06    B           NA    NA      NA      NA       NA    NA
Oct-06    B           NA    NA      NA      NA       NA    NA
Nov-06    B           NA    NA      NA      NA       NA    NA
Dec-06    B           NA    NA      NA      NA       NA    NA
Jan-05    C           NA    NA      NA      NA       NA    NA
Feb-05    C           NA    NA      NA      NA       NA    NA
Mar-05    C           NA    NA      NA      NA       NA    NA
Apr-05    C           NA    NA      NA      NA       NA    NA
May-05    C           NA    NA      NA      NA       NA    NA
Jun-05    C           NA    NA      NA      NA       NA    NA
Jul-05    C           NA    NA      NA      NA       NA    NA
Aug-05    C           NA    NA      NA      NA       NA    NA
Sep-05    C           NA    NA      NA      NA       NA    NA
Oct-05    C           NA    NA      NA      NA       NA    NA
Nov-05    C           NA    NA      NA      NA       NA    NA
Dec-05    C           NA    NA      NA      NA       NA    NA
Jan-06    C           12    12      12      12       12    12
Feb-06    C           12    12      12      12       12    12
Mar-06    C           12    12      12      12       12    12
Apr-06    C           12    12      12      12       12    12
May-06    C           12    12      12      12       12    12
Jun-06    C           12    12      12      12       12    12
Jul-06    C           12    12      12      12       12    12
Aug-06    C           12    12      12      12       12    12
Sep-06    C           12    12      12      12       12    12
Oct-06    C           12    12      12      12       12    12
Nov-06    C           12    12      12      12       12    12
Dec-06    C           12    12      12      12       12    12

正如我之前提到的,我将几个数据框合并起来可能会产生数十万行,所以我可以解决内存和空间问题。非常感谢您的帮助。

【问题讨论】:

    标签: r merge panel-data


    【解决方案1】:

    当速度和内存成为问题时,有两种替代方案,尤其是 data.table 替代方案:

    基础 R:

    将数据框合二为一:

    df3 <- rbind(df1,df2)
    

    使用Monthvariableexpand.grid 的所有可能组合创建参考数据框:

    ref <- expand.grid(Month = unique(df3$Month), variable = unique(df3$variable))
    

    将它们与all.x=TRUE 合并在一起,以确保用 NA 值填充缺失的组合:

    merge(ref, df3, by = c("Month", "variable"), all.x = TRUE)
    

    或者(感谢@PierreLafortune):

    merge(ref, df3, by=1:2, all.x = TRUE)
    

    数据表:

    使用 'rbindlist' 将数据帧绑定成一个,返回一个 'data.table':

    library(data.table)
    DT <- rbindlist(list(df1,df2))
    

    加入引用以确保所有组合都存在并且缺少的组合用 NA 填充:

    DT[CJ(Month, variable, unique = TRUE), on = c(Month="V1", variable="V2")]
    

    一键搞定:

    DT <- rbindlist(list(df1,df2))[CJ(Month, variable, unique = TRUE), on = c(Month="V1", variable="V2")]
    

    另一种方法是将rbindlist 包装在setkey 中,然后用CJ 扩展(交叉连接):

    DT <- setkey(rbindlist(list(df1,df2)), Month, variable)[CJ(Month, variable, unique = TRUE)]
    

    【讨论】:

    • 我有基础 R,它工作得很好,唯一的事情是如果你能在最后的插图中注意到数据是这样排序的。 A 首先是 2005 年和 2006 年的值,然后是 co。 B 代表 2005 年和 2006 年。但是当我订购它时,我会得到 A 的 2005 年的值,然后是 B 的 2005 年的值。
    【解决方案2】:

    有一个功能。将数据框与rbind 合并。然后使用complete。它将查看variable 中的组并用缺失值填充任何组:

    library(tidyr)
    df3 <- do.call(rbind.data.frame, list(df1, df2))
    df3$Month <- as.character(df3$Month)
    df4 <- complete(df3, Month, variable)
    df4$Month <- as.yearmon(df4$Month, "%b %Y")
    df5 <- df4[order(df4$variable,df4$Month),]
    df5
    # Source: local data frame [72 x 8]
    # 
    #       Month variable Beta1 Beta2 Beta3 Beta4 Beta5 Beta6
    #      (yrmn)   (fctr) (int) (int) (int) (int) (int) (int)
    # 1  Jan 2005        A     1     2     3     4     5     6
    # 2  Feb 2005        A     2     3     4     5     6     7
    # 3  Mar 2005        A     3     4     5     6     7     8
    # 4  Apr 2005        A     4     5     6     7     8     9
    # 5  May 2005        A     5     6     7     8     9    10
    # 6  Jun 2005        A     6     7     8     9    10    11
    # 7  Jul 2005        A     7     8     9    10    11    12
    # 8  Aug 2005        A     8     9    10    11    12    13
    # 9  Sep 2005        A     9    10    11    12    13    14
    # 10 Oct 2005        A    10    11    12    13    14    15
    # ..      ...      ...   ...   ...   ...   ...   ...   ...
    

    dplyr 和 tidyr 的替代实现

    library(dplyr)
    library(tidyr)
    
    df3 <- bind_rows(df1, df2) %>% 
      complete(Month, variable)
    

    【讨论】:

    • 当我运行这部分代码newdf &lt;- complete(df3, Month, variable) 时,我收到错误Error: cannot join on columns 'Month' x 'Month': Can't join on 'Month' x 'Month' because of incompatible types (yearmon / yearmon) complete也是 tidyr 包的一部分吗?
    • 您的日期格式再次困扰您。在其他两个 df3[,1] &lt;- as.character(df3[,1]) 之间添加这一行
    • 使用do.call(rbind, list(...)) 与仅使用rbind 相比似乎有点多余
    • 一切正常,但当我运行订单代码df5 &lt;- df4[order(df4$variable,df4$Month),]时没有任何反应
    • 变量列已被排序,但月份再次按字母顺序排列,尽管我运行 zoo 并检查了 Month 的类其字符
    猜你喜欢
    • 2020-06-07
    • 2021-08-25
    • 1970-01-01
    • 2021-06-01
    • 2017-01-19
    • 2020-01-13
    • 1970-01-01
    • 2014-12-02
    • 2021-01-29
    相关资源
    最近更新 更多