2017-08-08 161 views
0

我有一個數據框df,如下所示,它具有兩個功能,即離開的城市和到達城市。每兩行信息都存儲在一個正在進行的和返回的航班中。R - 在不同行中比較兩列中的值

Departure Arrival 
1 A   B 
2 B   A 
3 F   G 
4 G   F 
5 U   V 
6 V   U 
7 K   L 
8 K   L 

有在重複同樣的飛行,因爲它可以在最後兩行可以看出,數據不一致一些。

如何才能比較每兩行第一行的出發城市和第二行的到達城市,並保持相同的行。 數據集非常大,當然for循環不被視爲一個選項。

預先感謝您。

+0

在你有準備飛行中排7,8連續兩行的情況下,你後獲得第9行的實際回報呢,還是直接去到另一個航班? – Lamia

+0

我在下面發佈了幾個選項,但我會說你會因爲發佈一些非常可以谷歌的東西而在這裏被撕掉。在20803之前其他人會這樣說,先嚐試搜索。 – ike

+0

它轉到另一個航班。謝謝 – user159941

回答

3

下面是一個方法,比較使用headtail排成對的行對。

# find Departures that match the Arrival in the next row 
sames <- which(head(dat$Departure, -1) == tail(dat$Arrival, -1)) 
# keep pairs of rows that match, maintaining order with `sort` 
dat[sort(unique(c(sames, (sames + 1)))),] 
    Departure Arrival 
1   A  B 
2   B  A 
3   F  G 
4   G  F 
5   U  V 
6   V  U 

請注意,兩個變量必須是字符向量,而不是因子變量。如有必要,您可以使用as.character將它們強制轉換爲字符。

數據

dat <- 
structure(list(Departure = c("A", "B", "F", "G", "U", "V", "K", 
"K"), Arrival = c("B", "A", "G", "F", "V", "U", "L", "L")), .Names = c("Departure", 
"Arrival"), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5", "6", "7", "8")) 
+0

這種方法非常有效,除非出現重複行後跟與之前到達相同的行,例如使用' dat2 = rbind(dat,c(「L」,「K」),c(「K」,「P」))或者dat3 = rbind(dat,c(「L」,「T」),c 「T」,「P」))',那麼它會刪除錯誤的行。 – Lamia

+0

鑑於提供的數據,返回的值將是相同的(行名除外)。如果其他列可用,則可以在組級別操作中使用這些列來區分它們。 – lmo

0

嘗試以下解決方案,它是否適合你:

df[duplicated(paste0(df$Departure,df$Arrival))==F,] 
+0

這對我來說是一個很好的補充,因爲它說明了如何通過重複列來實現。我會說,雖然只有兩個,但... – ike

1

所以你只想獨特的飛行軌跡?有許多方法可以做到這一點,我倒是覺得最快將與data.table,是這樣的:

library(data.table) 
df <- as.data.table(df) 

uniqueDf <- unique(df) 

,你也可以使用複製功能,如

df <- df[!duplicated(df), ] 

東西應該做得很好。

+2

如果你想刪除重複的行,這很好用,但我認爲訂單在這裏很重要。如果從同一地點和目的地有兩套航班怎麼辦?這將除去第一對中的所有對象。 – Eumenedies

+0

@Eumenedies公平,閱讀整篇文章的方式!我實際上從方法的角度建議,這個人誤解了實際上唯一的航班,作爲重複的任何其他識別信息。如果不知道它們是否相同,我會猶豫不決...... – ike

0

這個答案不查找唯一的記錄,它專門檢查,如果行是行的副本之前。

添加了1新列,如果該行一直重複:

for(i in 2:length(df$Departure)){df$test[i]=ifelse(df$Departure[i] == df$Departure[i-1] & df$Arrival[i] == df$Arrival[i-1], 1,0)} 

循環可能會很慢,但:

library(data.table)

df$test2 = ifelse(df$Departure == shift(df$Departure) & df$Arrival == shift(df$Arrival), 1,0) 
1

你也可以這樣來做:

right = rep(df[c(T,F),"Arrival"]==df[c(F,T),"Departure"],each=2) 
df[right,] 

這將返回:

Departure Arrival 
1   A  B 
2   B  A 
3   F  G 
4   G  F 
5   U  V 
6   V  U