将数据框列值映射到n×n矩阵

时间:2018-11-08 13:42:18

标签: r dataframe mapping adjacency-matrix

我试图将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,一个国家的ridpid相同。 rid列中的相同ID与pid列中的TradeValue列中的多行匹配。

但是,此数据存在一些问题。首先,由于未报告贸易统计信息的国家(通常为发展中国家)没有要提取的数据,因此rid列中没有其ID(例如国家1)。另一方面,这些国家的ID可能会通过其他国家的报告进入pid列(在这种情况下,报告者往往是发达国家)。因此,rid列仅包含一些国家/地区ID(161个中只有139个),而pid列具有所有161个国家/地区ID。

我要尝试的是将此example_data数据帧映射到161 x 161邻接矩阵,其中rid用于行,pid用于列,其中每个单元格代表{{ 1}}之间的任何两个国家/地区ID。为此,我需要处理以下几件事:

  1. 填写TradeValue的{​​{1}}列中缺少的国家/地区ID,并暂时将其相应行中的所有单元格值设置为0。
  2. 在上一步中,使用其他国家/地区报告的双边贸易统计来估算那些“ 0”单元;如果相应的统计信息仍然不可用,请保留这些“ 0”单元格。

例如,对于以下形式的5国数据框

rid

所需的输出应如下所示

example_data

但是在我的脑海中,我不知道该怎么做。如果有人可以帮助我,将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

秘密/技巧:

  • 使用因子变量告诉R什么值以及顺序都是可能的。

  • 在data.tables中dcast使用fill = 0(在没有任何内容的地方填充零),drop = FALSE(输入未观察到的因子水平)