R:社交网络 - 基于不同列和行中的条件的最大值

时间:2017-02-10 16:08:34

标签: r social-networking

我想根据虚构的贸易调查示例转换以下示例数据。可以想象,国家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;,但我没有在这里报告代码。

有什么想法吗?非常感谢您的建议。

1 个答案:

答案 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