乘n矩阵映射数据帧列的值到(Mapping dataframe column values to a

2019-10-29 18:14发布

我想一列值映射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是相同的。 在相同的ID(一个或多个) rid柱与在多行匹配pid在以下方面柱TradeValue

然而,也有一些问题,与此数据。 首先,因为没有报告贸易统计的国家(通常是发展中国家)没有数据被提取,其ID(S)的缺席rid列(如国家1)。 在另一方面,这些国家的ID(一个或多个)可进入pid通过其他国家的报告列(在这种情况下,记者往往是发达国家)。 因此, rid列只包含一些国家ID(仅139出的161),而pid列有所有161国家ID。

我正在试图做的是映射这个example_data数据框使用一个161 X 161邻接矩阵rid了行和pid列其中每个单元代表TradeValue任何两个国家之间的ID。 为此,有一对夫妇的事情,我需要解决:

  1. 填写所缺的那些国家ID(S) ridexample_data和暂时,在与各行设置的所有单元格的值设置为0。
  2. 通过前面的步骤,使用归咎于其他国家报告的双边贸易统计那些“0”细胞; 如果相应的统计数据仍然不可用,留下那些“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

但在我心中的顶部,我无法弄清楚如何。 这将非常感激,如果有人可以帮助我在此。

Answer 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 (使对于未观察到的因素级别的条目)



文章来源: Mapping dataframe column values to a n by n matrix