R中的面板数据形成

Panel Data formation in R

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

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 但我的数据集与这个不同。非常感谢您在这方面的帮助。

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

第一个函数 melt 生成一个由 id.var=c("Month", "Beta") 指定的长数据帧。因此,输出会将 "A" 和 "B" 列合并到名为 variable 的列中,并创建一个单独的 value 列。有了那个融化的 data.frame,我们就可以用 dcast 投宽了。公式 Month+variable ~ Beta 在波浪号 (~) 的左侧有 id 变量,在右侧有 measure 变量。为方便起见,这两个功能合并在 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

使用包 {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

您可以在在线提供的 Reshape pdf 中找到相同的答案。 请通过此 link.
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)

如果您按照所有示例进行操作,就会找到答案。 Reshape 是一个方便的包。 希望这对你有帮助。