在 R 中创建包含大量数据的面板数据

Creating panel-data with a lot of data in R

我目前在将大量数据合并到面板数据中时遇到问题。我发现这个解决方案可以帮助我解决 "smaller" 解决方案:Panel Data 但我不能将其应用于 "bigger" 格式。

我将尝试编写一个编码示例: 来自“数据集”包:

df_1 = WorldPhones # In my case, years 2000-2014 and 43 columns (districts)
df_2 = WorldPhones # In my case, there is different data here
df_3 = WorldPhones # ""
df_4 = WorldPhones # ""

每个数据框包含 43 个区中每个区的不同值。我给每个区一个唯一的 id(1 到 43)。 43个区相当于数据集WorldPhones给出的7个地区(大洲)。 每个数据框仅包含每个地区和每年的一个变量。假设 df_1 包含变量 X1,df_2 包含 X2 等等。 我想将这些数据转换成 "long" 格式,像这样:

Id  Year  X1     X2    X3   ...
1   1951  45939  21574 2876  
1   1956  60423  29990 4708 
1   1957  64721  32510 5230 
1   1958  68484  35218 6662 
1   1959  71799  37598 6856 
1   1960  76036  40341 8220
1   1961  79831  43173 9053 
2   1951  45939  21574 2876  
2   1956  60423  29990 4708 
2   1957  64721  32510 5230 
2   1958  68484  35218 6662 
2   1959  71799  37598 6856 
2   1960  76036  40341 8220
2   1961  79831  43173 9053 
...
43  1951  45939  21574 2876  
43  1956  60423  29990 4708 
43  1957  64721  32510 5230 
43  1958  68484  35218 6662 
43  1959  71799  37598 6856 
43  1960  76036  40341 8220
43  1961  79831  43173 9053 

不幸的是,我真的不知道该怎么做,除了 "brute force" 会写 "it down" 43 次。

使用 tidyrreshape2 都非常容易。恕我直言,每个 R 用户都应该学习使用这两个包以及 data.tabledplyr

library("datasets")
library(reshape2)
library(dplyr) 
WorldPhones <- data.frame(WorldPhones)    # matrix format to data.frame
WorldPhones$Year <- rownames(WorldPhones) # create Year column
df_1 <- df_2 <- df_3 <- WorldPhones       # 
# transform to long format using melt from reshape2
df_1 <- melt(df_1, id.vars = "Year", variable.name = "Id", value.name="X")      
df_2 <- df_3 <- df_1                      # similarly for df_2, df_3. 
# merge the datasets using left_join from dplyr   
 df_1 %>%
  left_join(df_2,  by=c("Year", "Id")) %>%
  left_join(df_3,  by=c("Year", "Id")) %>% head
  Year     Id   X.x   X.y     X
1 1951 N.Amer 45939 45939 45939
2 1956 N.Amer 60423 60423 60423
3 1957 N.Amer 64721 64721 64721
4 1958 N.Amer 68484 68484 68484
5 1959 N.Amer 71799 71799 71799
6 1960 N.Amer 76036 76036 76036

或使用data.table

library("data.table")
dt_1 <- setDT(WorldPhones)
dt_1 <- melt(dt_1, id.vars = "Year", variable.name = "Id", value.name="X")
setkey(dt_1, Year, Id)
dt_2 <- dt_3 <- dt_1
dt_1[dt_2][dt_3]         
    Year       Id     X   i.X i.X.1
 1: 1951   N.Amer 45939 45939 45939
 2: 1951   Europe 21574 21574 21574
 3: 1951     Asia  2876  2876  2876
 4: 1951   S.Amer  1815  1815  1815
 5: 1951  Oceania  1646  1646  1646