将数据帧列值映射到 n x n 矩阵
Mapping dataframe column values to a n by n matrix
我正在尝试将 data.frame
对象(由 161 个国家/地区之间的大量双边贸易数据组成)的列值映射到 161 x 161 邻接矩阵(也是 data.frame
class) 这样每个单元格代表任何两个国家之间的二元贸易流量。
数据是这样的
# 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
是reporter id,pid
是(trade)partner id,一个国家的rid
和pid
是一样的。根据 TradeValue
.
,rid
列中的相同 ID 与 pid
列中的多行匹配
但是,这个数据存在一些问题。首先,由于没有报告贸易统计数据的国家(通常是发展中国家)没有数据可供提取,因此 rid
列中没有它们的 id(例如国家 1)。另一方面,这些国家/地区 ID 可能会通过其他国家/地区的报告进入 pid
列(在这种情况下,报告者往往是发达国家)。因此,rid
列仅包含部分国家/地区 ID(161 个国家/地区中仅包含 139 个),而 pid
列包含所有 161 个国家/地区 ID。
我想做的是将此 example_data
数据帧映射到 161 x 161 邻接矩阵,行使用 rid
,列使用 pid
,其中每个单元格代表TradeValue
介于任意两个国家 ID 之间。为此,我需要解决几件事:
- 填写
example_data
的 rid
列中缺失的国家/地区 ID,并暂时将各自行中的所有单元格值设置为 0。
- 通过上一步,使用其他国家报告的双边贸易统计数据来估算那些“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
但在我的脑海中,我不知道该怎么做。如果有人可以帮助我,我将不胜感激。
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
(为不存在的因子水平输入条目t 观察到)
我正在尝试将 data.frame
对象(由 161 个国家/地区之间的大量双边贸易数据组成)的列值映射到 161 x 161 邻接矩阵(也是 data.frame
class) 这样每个单元格代表任何两个国家之间的二元贸易流量。
数据是这样的
# 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
是reporter id,pid
是(trade)partner id,一个国家的rid
和pid
是一样的。根据 TradeValue
.
rid
列中的相同 ID 与 pid
列中的多行匹配
但是,这个数据存在一些问题。首先,由于没有报告贸易统计数据的国家(通常是发展中国家)没有数据可供提取,因此 rid
列中没有它们的 id(例如国家 1)。另一方面,这些国家/地区 ID 可能会通过其他国家/地区的报告进入 pid
列(在这种情况下,报告者往往是发达国家)。因此,rid
列仅包含部分国家/地区 ID(161 个国家/地区中仅包含 139 个),而 pid
列包含所有 161 个国家/地区 ID。
我想做的是将此 example_data
数据帧映射到 161 x 161 邻接矩阵,行使用 rid
,列使用 pid
,其中每个单元格代表TradeValue
介于任意两个国家 ID 之间。为此,我需要解决几件事:
- 填写
example_data
的rid
列中缺失的国家/地区 ID,并暂时将各自行中的所有单元格值设置为 0。 - 通过上一步,使用其他国家报告的双边贸易统计数据来估算那些“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
但在我的脑海中,我不知道该怎么做。如果有人可以帮助我,我将不胜感激。
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
(为不存在的因子水平输入条目t 观察到)