我想为双边贸易流数据帧(以from
,to
和amount
交易格式编码)生成一组dyad标识符,以便可以使用这些标识符标识符以进行进一步的统计分析。
下面提供了我的示例数据,从中我从涉及美国的数据中提取并确定了独特的国家二元组。
# 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
和to
列中的这些唯一对偶对,并生成一个唯一对偶标识符列表作为新列(例如, dyad
到df(trade_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
答案 0 :(得分:2)
假设流是有方向的,因此A / B和B / A是不同的流,请将from
和to
列粘贴在一起并转换为因数。分解使用的内部代码为1、2,...,no_of_levels,并使用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
的所有DF
使用这些分配,则将NA用于{不在DF0
中的{1}},然后按照上述方式执行对偶的分配(请参见下面的第一行),然后从DF0
中删除流编号,并使用{{1}提取其唯一的行}。最后,使用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
答案 1 :(得分: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))