2017-02-10 10 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