【问题标题】:Panel Data formation in RR中的面板数据形成
【发布时间】:2016-06-06 22:23:20
【问题描述】:

我有一个包含大量公司的数据集。对于每家公司,我估计了一段时间内每个月的衡量标准,即一年。但是现在我想将这个数据集重组为面板数据。下面我说明我拥有的数据集。

Month   Beta    A   B
Jan-05  Beta1   1   32
Jan-05  Beta2   2   32
Jan-05  Beta3   3   32
Jan-05  Beta4   4   32
Jan-05  Beta5   5   32
Jan-05  Beta6   6   32
Feb-05  Beta1   7   32
Feb-05  Beta2   8   32
Feb-05  Beta3   9   32
Feb-05  Beta4   10  32
Feb-05  Beta5   11  32
Feb-05  Beta6   12  32
Mar-05  Beta1   13  32
Mar-05  Beta2   14  32
Mar-05  Beta3   15  32
Mar-05  Beta4   16  32
Mar-05  Beta5   17  32
Mar-05  Beta6   18  32
Apr-05  Beta1   19  32
Apr-05  Beta2   20  32
Apr-05  Beta3   21  32
Apr-05  Beta4   22  32
Apr-05  Beta5   23  32
Apr-05  Beta6   24  32
May-05  Beta1   25  32
May-05  Beta2   26  32
May-05  Beta3   27  32
May-05  Beta4   28  32
May-05  Beta5   29  32
May-05  Beta6   30  32
Jun-05  Beta1   31  32
Jun-05  Beta2   32  32
Jun-05  Beta3   33  32
Jun-05  Beta4   34  32
Jun-05  Beta5   35  32
Jun-05  Beta6   36  32
Jul-05  Beta1   37  32
Jul-05  Beta2   38  32
Jul-05  Beta3   39  32
Jul-05  Beta4   40  32
Jul-05  Beta5   41  32
Jul-05  Beta6   42  32
Aug-05  Beta1   43  32
Aug-05  Beta2   44  32
Aug-05  Beta3   45  32
Aug-05  Beta4   46  32
Aug-05  Beta5   47  32
Aug-05  Beta6   48  32
Sep-05  Beta1   49  32
Sep-05  Beta2   50  32
Sep-05  Beta3   51  32
Sep-05  Beta4   52  32
Sep-05  Beta5   53  32
Sep-05  Beta6   54  32
Oct-05  Beta1   55  32
Oct-05  Beta2   56  32
Oct-05  Beta3   57  32
Oct-05  Beta4   58  32
Oct-05  Beta5   59  32
Oct-05  Beta6   60  32
Nov-05  Beta1   61  32
Nov-05  Beta2   62  32
Nov-05  Beta3   63  32
Nov-05  Beta4   64  32
Nov-05  Beta5   65  32
Nov-05  Beta6   66  32
Dec-05  Beta1   67  32
Dec-05  Beta2   68  32
Dec-05  Beta3   69  32
Dec-05  Beta4   70  32
Dec-05  Beta5   71  32
Dec-05  Beta6   72  32

可以观察到,每个月都计算了六个单独的度量 Beta1、Beta2、Beta3、Beta4、Beta5 和 Beta6。现在我想把它改造成如下

Month   Company Beta1   Beta2   Beta3   Beta4   Beta5   Beta6
Jan-05  A        1         2      3       4        5    6
Feb-05  A        7         8      9       10       11   12
Mar-05  A       13        14      15      16       17   18
Apr-05  A       19        20      21      22       23   24
May-05  A       25        26      27      28       29   30
Jun-05  A       31        32      33      34       35   36
Jul-05  A       37        38      39      40       41   42
Aug-05  A       43        44      45      46       47   48
Sep-05  A       49        50      51      52       53   54
Oct-05  A       56        57      58      59       60   61
Nov-05  A       62        63       64     65       66   67
Dec-05  A       68        69       70      71     72    73
Jan-05  B       32        32       32      32     32    32
Feb-05  B       32        32       32      32     32    32
Mar-05  B       32        32       32      32     32    32
Apr-05  B       32        32       32      32     32    32
May-05  B       32        32       32      32     32    32
Jun-05  B       32        32       32      32     32    32
Jul-05  B       32        32       32      32     32    32
Aug-05  B       32        32       32      32     32    32
Sep-05  B       32        32       32      32     32    32
Oct-05  B       32        32       32      32     32    32
Nov-05  B       32        32       32      32     32    32
Dec-05  B       32        32       32      32     32    32

我的原始数据集有上千列。我提到了enter link description here,但我的数据集与这个不同。非常感谢您在这方面的帮助。

【问题讨论】:

标签: r reshape2 panel-data


【解决方案1】:

您可以在在线提供的 Reshape pdf 中找到相同的答案。 请通过此链接。
https://cran.r-project.org/web/packages/reshape/reshape.pdf

https://cran.r-project.org/web/packages/reshape2/reshape2.pdf

# This is an example. 
names(airquality) <- tolower(names(airquality))
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)
cast(aqm, day ~ month ~ variable)
# Not only sorting there are many other possiblities. 
cast(aqm, month ~ variable, mean)
cast(aqm, month ~ . | variable, mean)
cast(aqm, month ~ variable, mean, margins=c("grand_row", "grand_col"))
cast(aqm, day ~ month, mean, subset=variable=="ozone")
cast(aqm, month ~ variable, range)
cast(aqm, month ~ variable + result_variable, range)
cast(aqm, variable ~ month ~ result_variable,range)

如果您遵循所有示例,就会有答案。重塑是方便的包。 希望对您有所帮助。

【讨论】:

    【解决方案2】:

    这是经典的recastid.var 参数转到 melt,其他参数转到 dcast

    第一个函数melt 产生一个用id.var=c("Month", "Beta") 指定的长数据帧。因此,输出将在名为variable 的列中组合列“A”和“B”,并创建一个单独的value 列。随着 data.frame 的融化,我们可以使用 dcast 进行广泛投掷。公式Month+variable ~ Beta 左边有 id 变量(~),右边有测量变量。为方便起见,这两个功能都合并在recast 中。

    如果顺序很重要,请将“月份”列转换为日期和最后的顺序:

    library(zoo)
    library(reshape2)
    df[,1] <- as.yearmon(df[,1], "%b-%y")
    newdf <- recast(df, id.var=c("Month", "Beta"), Month+variable~Beta, value.var="value")
    newdf <- newdf[order(newdf$variable,newdf$Month),]
    newdf[,1] <- format(newdf$Month, "%b-%y")
    newdf
    #     Month variable Beta1 Beta2 Beta3 Beta4 Beta5 Beta6
    # 1  Jan-05        A     1     2     3     4     5     6
    # 3  Feb-05        A     7     8     9    10    11    12
    # 5  Mar-05        A    13    14    15    16    17    18
    # 7  Apr-05        A    19    20    21    22    23    24
    # 9  May-05        A    25    26    27    28    29    30
    # 11 Jun-05        A    31    32    33    34    35    36
    # 13 Jul-05        A    37    38    39    40    41    42
    # 15 Aug-05        A    43    44    45    46    47    48
    # 17 Sep-05        A    49    50    51    52    53    54
    # 19 Oct-05        A    55    56    57    58    59    60
    # 21 Nov-05        A    61    62    63    64    65    66
    # 23 Dec-05        A    67    68    69    70    71    72
    # 2  Jan-05        B    32    32    32    32    32    32
    # 4  Feb-05        B    32    32    32    32    32    32
    # 6  Mar-05        B    32    32    32    32    32    32
    # 8  Apr-05        B    32    32    32    32    32    32
    # 10 May-05        B    32    32    32    32    32    32
    # 12 Jun-05        B    32    32    32    32    32    32
    # 14 Jul-05        B    32    32    32    32    32    32
    # 16 Aug-05        B    32    32    32    32    32    32
    # 18 Sep-05        B    32    32    32    32    32    32
    # 20 Oct-05        B    32    32    32    32    32    32
    # 22 Nov-05        B    32    32    32    32    32    32
    # 24 Dec-05        B    32    32    32    32    32    32
    

    【讨论】:

    • 感谢您的回答,但我想重新安排它,以便从 05 年 1 月 5 日到 05 年 12 月的每项措施的 A 公司值排在第一位,而 B 公司的值相同。它真的很接近我想要的输出。
    • 那只是最后的排序。努力工作在示例中。
    • 能否告诉我如何排序,我将不胜感激。
    • 如果你添加 dput(head(mydata)) 其中 mydata 是你的 data.frame 的名称我可以看到你的变量的结构
    • 谢谢我得到了想要的输出。感谢您的耐心等待我希望我不会被踢出这个网站,以便将来更充分地解释我的问题。
    【解决方案3】:

    使用包 {tidyr} 中的函数:

    df <- data.frame(Month = c(rep("Jan-05", 6), rep("Feb-05",6)),  
                     Beta = c(paste0("Beta",1:6), paste0("Beta",1:6)), 
                     A  = 1:12,  
                     B=rep(32,12))
    
    df2 <- tidyr::gather(df, key = Company, value = val, A, B)
    
    df3 <- tidyr::spread(data = df2, key = Beta, value = val)
    
    ##   Month Company Beta1 Beta2 Beta3 Beta4 Beta5 Beta6
    ##1 Feb-05       A     7     8     9    10    11    12
    ##2 Feb-05       B    32    32    32    32    32    32
    ##3 Jan-05       A     1     2     3     4     5     6
    ##4 Jan-05       B    32    32    32    32    32    32
    

    【讨论】:

    • @Faith 使用常用软件包的两行解决方案到底有什么“不便”?这种方法到底是什么效率低下?我的测试显示计算时间与接受的答案相当。
    猜你喜欢
    • 2021-03-24
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多