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))
将导致以无方向的方式分配二元。