首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将dataframe列值映射为n乘n矩阵

将dataframe列值映射为n乘n矩阵
EN

Stack Overflow用户
提问于 2018-11-08 13:42:17
回答 1查看 144关注 0票数 0

我试图将一个data.frame对象(由161个国家之间的大量双边贸易数据组成)的列值映射到一个161 x 161邻接矩阵(也属于data.frame类),以便每个单元格表示任意两个国家之间的并进贸易流。

数据如下所示

代码语言:javascript
复制
# 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栏(如国家1)中没有它们的id。另一方面,这些国家可以通过其他国家的报告进入pid栏(在这种情况下,记者往往是发达国家)。因此,rid列只包含一些国家id (161个国家中只有139个),而pid列拥有全部161个国家id。

我想要做的是将这个example_data数据映射到一个161x161邻接矩阵,使用rid表示行,pid表示列,其中每个单元格表示任意两个国家id之间的TradeValue。为此,有几件事我需要解决:

  1. 填充rid列中缺少的国家id(s),并暂时将其各自行中的所有单元格值设置为0。
  2. 在前面的步骤中,使用其他国家报告的双边贸易统计数据对这些"0“单元进行估算;如果仍然无法获得相应的统计数据,则将这些"0”单元格保持不变。

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

代码语言:javascript
复制
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

所需的输出应该如下所示

代码语言:javascript
复制
     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

但最重要的是,我想不出该怎么做。如果有人能在这件事上帮我,我会很感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-08 13:48:06

代码语言:javascript
复制
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 (为未观察到的因素级别输入条目)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53208966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档