R:社交网络 - 基于不同列和行中条件的最大值
R: Social network - max values based on conditions in different columns and rows
我想根据虚构的贸易调查示例转换以下样本数据。想一想 A 国说它出口到 B 国(第 2 行,Export=1),而 B 国说它不从 A 进口(第 4 行,Import=0),反之亦然。我现在想获取数据集中所有这些匹配项的最大值 (=1),即在这种情况下,第 4 行中的导入将为 =1)。
> df <- data.frame("Sender" = c("A", "A", "A", "B", "B", "B", "C", "C", "C"),
+ "Receiver" = c("A", "B", "C", "A", "B", "C", "A", "B", "C"),
+ "Export"= c(0,1,0,0,0,0,0,0,0),
+ "Import" = c(0,1,1,0,0,1,0,0,0))
> df
Sender Receiver Export Import
1 A A 0 0
2 A B 1 1
3 A C 0 1
4 B A 0 0
5 B B 0 0
6 B C 0 1
7 C A 0 0
8 C B 0 0
9 C C 0 0
解决方案应该是
Sender Receiver Export Import Export_MAX Import_MAX
1 A A 0 0 0 0
2 A B 1 1 1 1
3 A C 0 1 0 1
4 B A 0 0 1 1
5 B B 0 0 0 0
6 B C 0 1 0 1
7 C A 0 0 1 0
8 C B 0 0 1 0
9 C C 0 0 0 0
我在本论坛和其他地方搜索了很多方法,但到目前为止找不到解决方案。我正在考虑在 "Import" 和 "Export" 列上应用最大函数,以 "Sender" 和 "Receiver" 中给出的值为条件,但我没有无法在此处报告代码。
有什么想法吗?非常感谢您的建议。
这是我自己的解决方案,以防有人遇到同样的问题。
df$Pairs <- paste(df$Sender,df$Receiver,sep = "-")
values <- df$Pairs[df$Export==1]
values2 <- df$Pairs[df$Import==1]
df$Import[df$Pairs %in% gsub("(\w+)-(\w+)","\2-\1", values)] <- 1
df$Export[df$Pairs %in% gsub("(\w+)-(\w+)","\2-\1", values2)] <- 1
第一行将所有发送方-接收方组合放入一个字符字段中 - 以“-”分隔。第二行和第三行为 export/import 条件为 1 的每一行创建对组合。最后两行使用 gsub 匹配单词组合 sender-receiver 或 receiver sender 匹配的所有实例,并替换这些值与 1.
解决方案(直接在Export/Import列):
Sender Receiver Export Import Export_MAX Import_MAX
1 A A 0 0 0 0
2 A B 1 1 1 1
3 A C 0 1 0 1
4 B A 1 1 1 1
5 B B 0 0 0 0
6 B C 0 1 0 1
7 C A 1 0 1 0
8 C B 1 0 1 0
9 C C 0 0 0 0
我想根据虚构的贸易调查示例转换以下样本数据。想一想 A 国说它出口到 B 国(第 2 行,Export=1),而 B 国说它不从 A 进口(第 4 行,Import=0),反之亦然。我现在想获取数据集中所有这些匹配项的最大值 (=1),即在这种情况下,第 4 行中的导入将为 =1)。
> df <- data.frame("Sender" = c("A", "A", "A", "B", "B", "B", "C", "C", "C"),
+ "Receiver" = c("A", "B", "C", "A", "B", "C", "A", "B", "C"),
+ "Export"= c(0,1,0,0,0,0,0,0,0),
+ "Import" = c(0,1,1,0,0,1,0,0,0))
> df
Sender Receiver Export Import
1 A A 0 0
2 A B 1 1
3 A C 0 1
4 B A 0 0
5 B B 0 0
6 B C 0 1
7 C A 0 0
8 C B 0 0
9 C C 0 0
解决方案应该是
Sender Receiver Export Import Export_MAX Import_MAX
1 A A 0 0 0 0
2 A B 1 1 1 1
3 A C 0 1 0 1
4 B A 0 0 1 1
5 B B 0 0 0 0
6 B C 0 1 0 1
7 C A 0 0 1 0
8 C B 0 0 1 0
9 C C 0 0 0 0
我在本论坛和其他地方搜索了很多方法,但到目前为止找不到解决方案。我正在考虑在 "Import" 和 "Export" 列上应用最大函数,以 "Sender" 和 "Receiver" 中给出的值为条件,但我没有无法在此处报告代码。
有什么想法吗?非常感谢您的建议。
这是我自己的解决方案,以防有人遇到同样的问题。
df$Pairs <- paste(df$Sender,df$Receiver,sep = "-")
values <- df$Pairs[df$Export==1]
values2 <- df$Pairs[df$Import==1]
df$Import[df$Pairs %in% gsub("(\w+)-(\w+)","\2-\1", values)] <- 1
df$Export[df$Pairs %in% gsub("(\w+)-(\w+)","\2-\1", values2)] <- 1
第一行将所有发送方-接收方组合放入一个字符字段中 - 以“-”分隔。第二行和第三行为 export/import 条件为 1 的每一行创建对组合。最后两行使用 gsub 匹配单词组合 sender-receiver 或 receiver sender 匹配的所有实例,并替换这些值与 1.
解决方案(直接在Export/Import列):
Sender Receiver Export Import Export_MAX Import_MAX
1 A A 0 0 0 0
2 A B 1 1 1 1
3 A C 0 1 0 1
4 B A 1 1 1 1
5 B B 0 0 0 0
6 B C 0 1 0 1
7 C A 1 0 1 0
8 C B 1 0 1 0
9 C C 0 0 0 0