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