我想根据虚构的贸易调查示例转换以下示例数据。可以想象,国家A说它出口到国家B(第2行,出口= 1),而国家B说它不从A进口(第4行,进口= 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
我在这个论坛和其他地方搜索了许多方法来做到这一点,但到目前为止还找不到解决方案。我正在考虑在&#34;导入&#34;上应用最大功能的方法。 &安培; &#34;出口&#34;列,以&#34; Sender&#34;中给出的值为条件; &安培; &#34; Receiver&#34;,但我没有在这里报告代码。
有什么想法吗?非常感谢您的建议。
答案 0 :(得分:0)
这是我自己的解决方案,以防有人遇到同样的问题。
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
第一行将所有发送者 - 接收者组合带入一个字符字段 - 由&#34; - &#34;分隔。第二行和第三行为导出/导入条件为1的每一行创建对组合。最后两行使用gsub匹配单词组合发送方 - 接收方或接收方发送方匹配的所有实例,并将这些值替换为1
解决方案(直接在“导出/导入”列中):
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