2017-10-09 20 views
0

下面的代碼按預期工作。執行直至幷包括行head(1),我發現JFK to LAX是航班最多的航線。然後,我使用inner_join來篩選flights表,以僅包含此路線上的航班。這給了我11,252行。用semi_join替換inner_join

library(nycflights13) 
library(dplyr) 

flights %>% 
    group_by(origin, dest) %>% 
    summarize(num_flights=n()) %>% 
    arrange(-num_flights) %>% 
    head(1) %>% # JFK to LAX has the most flights 
    select(origin, dest) %>% 
    inner_join(flights, by=c("origin", "dest")) 

我該如何改用semi_join來實現相同的目標?我想要如上所述的一行代碼,而不是使用臨時變量。但是,如果我將它寫入一個臨時變量,它會看起來像這樣。它給出了相同的結果:

filterList <- flights %>% 
    group_by(origin, dest) %>% 
    summarize(num_flights=n()) %>% 
    arrange(-num_flights) %>% 
    head(1) %>% 
    select(origin, dest) 

    semi_join(flights, filterList, by=c("origin", "dest")) 

我想保持類似的邏輯,首先我確定過濾器,然後應用它。我想我會對right_semi_join函數感興趣,但這不存在。

回答

1

使用.將鏈數據放入第二個參數而不是第一個參數。

flights %>% 
    group_by(origin, dest) %>% 
    summarize(num_flights=n()) %>% 
    arrange(-num_flights) %>% 
    head(1) %>% # JFK to LAX has the most flights 
    select(origin, dest) %>% 
    semi_join(flights, ., by=c("origin", "dest")) 
+0

非常感謝!現在我知道這存在了,它會更容易閱讀它的可能用途! https://stackoverflow.com/questions/35272457/what-does-the-dplyr-period-character-reference – Bobby

2

選擇最航班的航線,而無需使用連接

library(nycflights13) 
library(dplyr) 

df2 <- flights %>% 
    add_count(origin, dest) %>% 
    top_n(1) 

df2$n <- NULL 

> setequal(df1, df2) # assuming original data.frame is stored in df1 
TRUE