1

我想为双边贸易流数据帧(以 、 和交易格式编码)生成一组二元标识符,from以便toamount可以使用这些标识符进行进一步的统计分析。

下面提供了我的示例数据,我从中提取并识别了涉及美国的数据中的独特国家对。

# load the example data
trade_flow <- readRDS(gzcon(url("https://www.dropbox.com/s/ep7xldoq9go4f0g/trade_flow.rds?dl=1")))
# extract country dyads
country_dyad <- trade_flow[, c("from", "to")]
# identify unique pairs
up <- country_dyad[!duplicated(t(apply(country_dyad, 1, sort))),]
# extract only unique pairs that involve the US
up <- up[(up$from == "USA") | (up$to == "USA"), ]

## how can I use the unique pair object (up) to generate dyad identifiers and include them as a new column in the trade_flow dataframe

下一步是从原始trade_flow数据帧from的( 它应该类似于下面的格式,其中每个唯一的二元组都被识别并编码为唯一的数值。如果有人可以帮助我,我将不胜感激。todyadtrade_flow

from    to  trade_flow  dyad
USA   ITA      5100       2
USA   UKG      4000       1
USA   GMY     17000       3
USA   ITA      4500       2
USA   JPN      2900       4
USA   UKG      6700       1
USA   ROK      7000       5
USA   UKG      2300       1
USA   SAF      1500       6
IND   USA      2400       7
4

2 回答 2

2

这是一个使用选项base R

df1$dyad <- with(df1, as.integer(droplevels(interaction(from, to, 
        lex.order = TRUE))))
df1$dyad
#[1] 3 7 2 3 4 7 5 7 6 1

数据

df1 <- structure(list(from = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 1L), .Label = c("IND", "USA"), class = "factor"), to = structure(c(2L, 
6L, 1L, 2L, 3L, 6L, 4L, 6L, 5L, 7L), .Label = c("GMY", "ITA", 
"JPN", "ROK", "SAF", "UKG", "USA"), class = "factor"), trade_flow = c(5100L, 
4000L, 17000L, 4500L, 2900L, 6700L, 7000L, 2300L, 1500L, 2400L
)), class = "data.frame", row.names = c(NA, -10L))
于 2019-08-11T16:51:09.640 回答
2

假设流是定向的,因此 A/B 和 B/A 是不同的流,将fromto列粘贴在一起并转换为因子。factor 使用的内部代码是 1, 2, ..., no_of_levels 并提取那些 use as.numeric

transform(DF, dyad = as.numeric(factor(paste(from, to))))

给予:

   from  to trade_flow dyad
1   USA ITA       5100    3
2   USA UKG       4000    7
3   USA GMY      17000    2
4   USA ITA       4500    3
5   USA JPN       2900    4
6   USA UKG       6700    7
7   USA ROK       7000    5
8   USA UKG       2300    7
9   USA SAF       1500    6
10  IND USA       2400    1

将子集上的分配应用于整体

如果我们只想对 的行的子集执行此分配DF,例如head(DF),然后将这些分配用于所有DF使用 NA 用于DF不在其中的流,DF0则首先执行上述二元组的分配(参见下面的第一行)然后DF0使用 从中删除流编号并提取其唯一行unique。最后将其与DF前两列合并,all.x=TRUE以便DF不删除不匹配的行。

DF0 <- transform(head(DF), dyad = as.numeric(factor(paste(from, to))))
merge(DF, unique(DF0[-3]), all.x = TRUE, by = 1:2)

给予:

   from  to trade_flow dyad
1   IND USA       2400   NA
2   USA GMY      17000    1
3   USA ITA       4500    2
4   USA ITA       5100    2
5   USA JPN       2900    3
6   USA ROK       7000   NA
7   USA SAF       1500   NA
8   USA UKG       4000    4
9   USA UKG       2300    4
10  USA UKG       6700    4

笔记

以可重现的形式输入:

Lines <- "from to trade_flow
USA   ITA      5100       
USA   UKG      4000       
USA   GMY     17000       
USA   ITA      4500       
USA   JPN      2900       
USA   UKG      6700       
USA   ROK      7000       
USA   UKG      2300       
USA   SAF      1500       
IND   USA      2400"
DF <- read.table(text = Lines, header = TRUE)
于 2019-08-11T16:47:33.593 回答