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

时间:2015-03-11 10:17:27

标签: r panel-data

我目前在将大量数据合并到面板数据时遇到了问题。我发现这个解决方案可以帮助我减少"更小的"解决方案:Panel Data但我无法将其应用于更大的"格式。

我将尝试编写一个编码示例: 从包'数据集':

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 

不幸的是,我真的不知道如何做到这一点,除了"蛮力"这将是写下来"它下来" 43次。

1 个答案:

答案 0 :(得分:2)

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