我试图将一个data.frame对象(由161个国家之间的大量双边贸易数据组成)的列值映射到一个161 x 161邻接矩阵(也属于data.frame类),以便每个单元格表示任意两个国家之间的并进贸易流。
数据如下所示
# load the data from dropbox folder
library(foreign)
example_data <- read.csv("https://www.dropbox.com/s/hf0ga22tdjlvdvr/example_data.csv?dl=1")
head(example_data, n = 10)
rid pid TradeValue
1 2 3 500
2 2 7 2328
3 2 8 2233465
4 2 9 81470
5 2 12 572893
6 2 17 488374
7 2 19 3314932
8 2 23 20323
9 2 25 10
10 2 29 9026220
length(unique(example_data$rid))
[1] 139
length(unique(example_data$pid))
[1] 161在rid是记者id的地方,pid是(贸易)合作伙伴id,一个国家的rid和pid是相同的。rid列中相同的id与pid列中的多行在TradeValue方面相匹配。
但是,这些数据也存在一些问题。首先,由于没有报告贸易统计数据的国家(通常是发展中国家)没有需要提取的数据,因此在rid栏(如国家1)中没有它们的id。另一方面,这些国家可以通过其他国家的报告进入pid栏(在这种情况下,记者往往是发达国家)。因此,rid列只包含一些国家id (161个国家中只有139个),而pid列拥有全部161个国家id。
我想要做的是将这个example_data数据映射到一个161x161邻接矩阵,使用rid表示行,pid表示列,其中每个单元格表示任意两个国家id之间的TradeValue。为此,有几件事我需要解决:
rid列中缺少的国家id(s),并暂时将其各自行中的所有单元格值设置为0。例如,对于以下形式的5国数据
rid pid TradeValue
2 1 50
2 3 45
2 4 7
2 5 18
3 1 24
3 2 45
3 4 88
3 5 12
5 1 27
5 2 18
5 3 12
5 4 92所需的输出应该如下所示
pid_1 pid_2 pid_3 pid_4 pid_5
rid_1 0 50 24 0 27
rid_2 50 0 45 7 18
rid_3 24 45 0 88 12
rid_4 0 7 88 0 92
rid_5 27 18 12 92 0但最重要的是,我想不出该怎么做。如果有人能在这件事上帮我,我会很感激的。
发布于 2018-11-08 13:48:06
df1$rid = factor(df1$rid, levels = 1:5, labels = paste("rid",1:5,sep ="_"))
df1$pid = factor(df1$pid, levels = 1:5, labels = paste("pid",1:5,sep ="_"))
data.table::dcast(df1, rid ~ pid, fill = 0, drop = FALSE, value.var = "TradeValue")
# rid pid_1 pid_2 pid_3 pid_4 pid_5
#1 rid_1 0 0 0 0 0
#2 rid_2 50 0 45 7 18
#3 rid_3 24 45 0 88 12
#4 rid_4 0 0 0 0 0
#5 rid_5 27 18 12 92 0秘密/诀窍:
dcast中,使用fill = 0 (在没有任何数据的地方填充零),drop = FALSE (为未观察到的因素级别输入条目)https://stackoverflow.com/questions/53208966
复制相似问题