使用唯一的列值对在数据框中生成二元标识符
Use unique pairs of column values to generate dyad identifiers in the dataframe
我想为双边贸易流量数据框(以 from
、to
和 amount
交易格式编码)生成一组二元标识符,以便我可以使用这些标识符进行进一步的统计分析。
我的示例数据在下面提供,我从涉及美国的数据中提取并识别了独特的国家对偶。
# 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
假设流量是定向的,因此 A/B 和 B/A 是不同的流量,将 from
和 to
列粘贴在一起并转换为因数。 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))
我想为双边贸易流量数据框(以 from
、to
和 amount
交易格式编码)生成一组二元标识符,以便我可以使用这些标识符进行进一步的统计分析。
我的示例数据在下面提供,我从涉及美国的数据中提取并识别了独特的国家对偶。
# 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
假设流量是定向的,因此 A/B 和 B/A 是不同的流量,将 from
和 to
列粘贴在一起并转换为因数。 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))