2017-02-10 11 views
0

我想根据虚构的贸易调查示例转换以下示例数据。想一想,A国说它出口到B国(第2行,出口= 1),而B国说它不从A进口(第4行,进口= 0),反之亦然。我现在想要获得数据集中所有这些匹配的最大值(= 1),即在这种情况下,第4行中的导入将为= 1)。R:社交网络 - 根据不同列和行中的条件得出的最大值

> 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 

我搜索了很多方法可以做,在这个论坛和其他地方,也没有找到一个解决方案为止。我正在考虑沿着“导入”列中应用最大值函数的方法,以“发件人”&“接收者”中给出的值为条件,但我没有尽可能地达到在此处报告代码。

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

回答

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 

第一行将所有发送者 - 接收者组合带入一个字符字段 - 由“ - ”分隔。第二行和第三行为导出/导入条件为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