有没有一种方法可以使用聚集功能为变量创建面板数据集,而不必为每个变量创建单独的数据集?

时间:2019-04-14 13:03:55

标签: r tidyr

我正在尝试为多年中的多个变量创建一个面板数据集。我的数据在RStudio中采用以下格式:

     2012 2012 2012      2012  2013 2013   2013 .....
Name Var1 Var2 Var3......Var10 Var1 Var2...Var10.....
X      1    4   20 .......
Y      2    7   25 ......
Z      3    9   26 ...... and so on for each variable across years

我想为这些图像创建一个面板数据集

Name  Year Var1 Var2 Var3....Var10
X     2012 
Y     2012 
Z     2012 
X     2013
Y     2013 
Z     2013

我已按照以下步骤创建了面板:

  1. 合并了前两行,因此变量读为-2012.Var1,2012.Var2

  2. 使用collect函数为每个变量创建单独的数据集,如

    Name  Year       Var1
    X    2012.Var1   1
    Y    2012.Var2   2
    X    2013.Var1 and so on
    
  3. 然后我将表格组合成所需格式的一个数据框

对于步骤1:

colnames(df) <- paste(colnames(df), df[1, ])

对于步骤2:

Var1 <- df %>% gather(year, Var1, `2012.Var1`,`2012.Var2`and so on) 
Creating a Dataset for Var1
- did the same for all the variables

对于步骤3:

new_data = cbind(Var1,Var2, ..., Var10) # Combining Different Datasets
names(new_data)

尽管代码可用于创建数据框,但是当变量数量众多且分布多年时,这非常繁琐且耗时。我在寻找一种更简单的方法来创建相同的数据框?

1 个答案:

答案 0 :(得分:0)

我没有使用gather的解决方案,但是您可以使用merge.stack包中的splitstackshape函数一次性解决此问题。 https://cran.r-project.org/web/packages/splitstackshape/splitstackshape.pdf#page18

我将添加一个简单的示例:

  1. 创建样本数据集。在此示例中,我将使用“ ”作为分隔符来创建变量名称,并且年份将显示在“ ”之后。
library(splitstackshape)

set.seed(123)
dt1 <- data.frame(id = LETTERS[1:10],
                  var1_2012 = runif(10, min = 1, max = 10),
                  var2_2012 = runif(10, min = 1, max = 10),
                  var1_2013 = runif(10, min = 1, max = 10),
                  var2_2013 = runif(10, min = 1, max = 10))

print(dt1)
   id var1_2012 var2_2012 var1_2013 var2_2013
1   A  3.588198  9.611500  9.005854  9.667218
2   B  8.094746  5.080007  7.235231  9.120691
3   C  4.680792  7.098136  6.764561  7.216348
4   D  8.947157  6.153701  9.948428  8.159207
5   E  9.464206  1.926322  6.901352  1.221523
6   F  1.410008  9.098425  7.376774  5.300164
7   G  5.752949  3.214790  5.896594  7.826136
8   H  9.031771  1.378536  6.347278  2.947671
9   I  5.962915  3.951286  3.602438  3.863629
10  J  5.109533  9.590533  2.324023  3.084632
  1. 现在使用merge.stack以所需的格式获取它。 var.stubs是您要保留在列中的变量前缀的向量。 sep参数指定要使用的分隔符,将变量名称拆分。
dt2 <- splitstackshape::merged.stack(dt1,
                                     id.vars = "id",
                                     var.stubs = c("var1", "var2"),
                                     sep = "_",
                                     keep.all = TRUE)

print(dt2)

    id .time_1     var1     var2
 1:  A    2012 3.588198 9.611500
 2:  A    2013 9.005854 9.667218
 3:  B    2012 8.094746 5.080007
 4:  B    2013 7.235231 9.120691
 5:  C    2012 4.680792 7.098136
 6:  C    2013 6.764561 7.216348
 7:  D    2012 8.947157 6.153701
 8:  D    2013 9.948428 8.159207
 9:  E    2012 9.464206 1.926322
10:  E    2013 6.901352 1.221523
11:  F    2012 1.410008 9.098425
12:  F    2013 7.376774 5.300164
13:  G    2012 5.752949 3.214790
14:  G    2013 5.896594 7.826136
15:  H    2012 9.031771 1.378536
16:  H    2013 6.347278 2.947671
17:  I    2012 5.962915 3.951286
18:  I    2013 3.602438 3.863629
19:  J    2012 5.109533 9.590533
20:  J    2013 2.324023 3.084632