【问题标题】:Creating panel-data with a lot of data in R在 R 中使用大量数据创建面板数据
【发布时间】:2015-05-13 01:55:09
【问题描述】:

我目前在将大量数据组合成面板数据时遇到问题。我发现这个解决方案可以帮助我获得“更小”的解决方案: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 等等。 我想把这些数据变成“长”格式,这样想:

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 

不幸的是,我真的不知道该怎么做,除了“蛮力”,就是把“it down”写 43 次。

【问题讨论】:

    标签: r panel-data


    【解决方案1】:

    使用tidyrreshape2 非常简单。恕我直言,每个 R 用户都应该学会使用这两个包以及data.table,dplyr

    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
    

    【讨论】:

    • 太棒了!谢谢!我将您的第一个建议用于 dplyr 和 reshape2。 :)
    • 您是否还知道将相同数据(仅 1 列)复制到所有区域(区)的简单技巧?在这种情况下,所有地区的数据都是相等的。
    • 假设我有一个只有 2 列的数据框。一个是年限,另一个是利率。所有地区的利率都相同,因此我可以在面板数据分析中为每个地区 (Id) 使用相同的数据。 (通过在每个 id 中创建此数据的副本?)
    • 如果我没听错的话,假设您按时间顺序有interest 费率。根据合并面板数据的排序方式(在 dplyr 中按 Id 或在 data.table 答案中按 Year 排序),您可以连接 rep(interest, each=n)rep(interest, n) 其中 n 是数字的地区。希望这会有所帮助。
    • 我使用了data.frame(rep(list(df_interest), 43))。但这也将年份重复了 43 次。编辑:感谢您的评论,找到了解决方案!谢谢!
    猜你喜欢
    • 2015-08-02
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2019-07-20
    • 2013-06-14
    • 1970-01-01
    相关资源
    最近更新 更多