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

时间:2019-08-11 16:24:45

标签: r unique hierarchical-data pairwise

我想为双边贸易流数据帧(以fromtoamount交易格式编码)生成一组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_flowfromto列中的这些唯一对偶对,并生成一个唯一对偶标识符列表作为新列(例如, 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

2 个答案:

答案 0 :(得分:2)

假设流是有方向的,因此A / B和B / A是不同的流,请将fromto列粘贴在一起并转换为因数。分解使用的内部代码为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))