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

R 使用列值的唯一对在数据帧中生成二元标识符,r,unique,hierarchical-data,pairwise,R,Unique,Hierarchical Data,Pairwise,我想为双边贸易流数据帧生成一组二元标识符(在from、to和amount交易格式中编码),以便我可以使用这些标识符进行进一步的统计分析 下面提供了我的示例数据,从中我从涉及美国的数据中提取并确定了独特的国家二元关系 #加载示例数据 交易流量假设流量是直接的,因此A/B和B/A是不同的流量,将from和to列粘贴在一起,并转换为系数。factor使用的内部代码是1,2,…,没有任何级别的代码,要提取这些代码,请使用as.numeric transform(DF, dyad = as.numeric

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

下面提供了我的示例数据,从中我从涉及美国的数据中提取并确定了独特的国家二元关系

#加载示例数据

交易流量假设流量是直接的,因此A/B和B/A是不同的流量,将
from
to
列粘贴在一起,并转换为系数。factor使用的内部代码是1,2,…,没有任何级别的代码,要提取这些代码,请使用
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
   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
将子集上的赋值应用于整体 如果我们只想对
DF
行的子集执行此赋值,例如
head(DF)
,然后对
DF
中的所有
DF
使用NA对
DF
中不在
DF0
中的流使用这些赋值,那么首先执行如上所述的二元赋值(参见下面的第一行)然后从
DF0
中删除流号,并使用
unique
提取其唯一行。最后,使用
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)
注 以可复制形式输入:

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)

行假设流是直接流,因此A/B和B/A是不同的流,将
from
to
列粘贴在一起,并转换为因子。factor使用的内部代码是1,2,…,没有任何级别的代码,要提取这些代码,请使用
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
   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
将子集上的赋值应用于整体 如果我们只想对
DF
行的子集执行此赋值,例如
head(DF)
,然后对
DF
中的所有
DF
使用NA对
DF
中不在
DF0
中的流使用这些赋值,那么首先执行如上所述的二元赋值(参见下面的第一行)然后从
DF0
中删除流号,并使用
unique
提取其唯一行。最后,使用
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)
注 以可复制形式输入:

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$dyad这里有一个使用
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$dyad您好,谢谢您的回复,但是如果我想使用子组国家二元(
up
)在“完整数据”(
trade\u flow
)上生成二元标识符,同时将其余观察值(行)保留为NA(或简单地将其设置为组0),我应该修改代码的哪一部分?谢谢。如果您想对行的子集执行赋值,然后将该赋值应用于所有行,请参见答案中添加的部分。似乎如果我将二元
I
-
j
视为无向的,并使用该赋值匹配来自的
到数据帧中的
列,并为涉及
i
j
(包括
j
-
i
链接)的所有行生成二元标识符,它将使那些
=
&
=
的行不匹配。因此,R将返回一条错误消息,显示原始数据帧和唯一二元列表之间的“行数不同”。我想解决我的问题的另一种方法是:如果我们假设
I
-
j
二元为无向,建议的方法是将
i
-
j
j
-
i
计算为不同的二元数,并为它们分配一个唯一的数字指示器。有没有办法为
i
-
j
j
-
i
对分配相同的二元指示符?使用
粘贴(pmin(as.character(from),as.character(to)),pmax(as.character(from),as.character(to))
将导致以无方向的方式分配二元。您好,谢谢您的回复,但是,如果我想使用子集国家二元(
up
)在“完整数据”(
trade\u flow
)上生成二元标识符,同时将其余观察值(行)保留为NA(或简单地将其设置为组0),我应该修改代码的哪一部分?谢谢。如果您想对行的子集执行赋值,然后将该赋值应用于所有行,请参见答案中添加的部分。似乎如果我将二元
I
-
j
视为无向的,并使用该赋值匹配来自的
到数据帧中的
列,并为涉及
i
j
(包括
j
-
i
链接)的所有行生成二元标识符,它将使那些
=
&
=
的行不匹配。因此,R将返回一条错误消息,显示原始数据帧和唯一二元列表之间的“行数不同”。我想解决我的问题的另一种方法是:如果我们假设
I
-
j
二元为无向,建议的方法是将
i
-
j
j
-
i
计算为不同的二元数,并为它们分配一个唯一的数字指示器。有没有办法为
i
-
j
j
-
i
对分配相同的二元指示符?使用
粘贴(pmin(as.character(from)、as.character(to))、pmax(as.character(from)、as.character(to))
将导致以无方向的方式分配二元。