R

时间:2016-02-24 14:49:46

标签: r reshape2 panel-data

我有大量公司的数据集。对于每家公司,我估算了一段时间内每个月的措施,即一年。但现在我想将此数据集重组为面板数据。下面我将说明我拥有的数据集。

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

3 个答案:

答案 0 :(得分:3)

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

第一个函数melt生成一个用id.var=c("Month", "Beta")指定的长数据帧。因此输出将组合列" A"和" B"在名为variable的列中,创建单独的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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以在网上获得的重塑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)

如果您按照所有示例进行操作,则有答案。重塑是方便的包。 愿这对你有帮助。