在 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 次。
使用 tidyr
或 reshape2
都非常容易。恕我直言,每个 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
我目前在将大量数据合并到面板数据中时遇到问题。我发现这个解决方案可以帮助我解决 "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 次。
使用 tidyr
或 reshape2
都非常容易。恕我直言,每个 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