使用唯一的列值对在数据框中生成二元标识符

Use unique pairs of column values to generate dyad identifiers in the dataframe

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

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

# 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) fromto 列中匹配这些独特的二元组对,并生成一个独特的二元组标识符列表作为新列 (比如,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

假设流量是定向的,因此 A/B 和 B/A 是不同的流量,将 fromto 列粘贴在一起并转换为因数。 factor 使用的内部代码是 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 使用流的 NA在 DF 中不在 DF0 中,然后首先执行上面的二元组分配(见下面的第一行),然后从 DF0 中删除流号并使用 [= 提取其唯一行24=]。最后使用 all.x=TRUE 将其与前两列的 DF 合并,这样 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)

这是一个使用 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))