2017-10-09 14 views
0

Der folgende Code funktioniert wie erwartet. Ich führe bis einschließlich der Linie head(1), ich finde, dass JFK nach LAX ist die Route mit den meisten Flügen. Dann verwende ich inner_join, um die flights Tabelle zu filtern, um nur Flüge auf dieser Route einzuschließen. Das gibt mir 11.252 Zeilen.Ersetzen Sie inner_join durch semi_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")) 

Wie kann ich stattdessen semi_join verwenden, um das gleiche Ziel zu erreichen? Ich möchte eine einzelne Codezeile wie oben verwenden, anstatt eine temporäre Variable zu verwenden. Wenn ich es jedoch mit einer Temp-Variable schreiben würde, würde es so aussehen. Es gibt das gleiche Ergebnis:

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")) 

Ich mag würde die Logik ähnlich so halten, dass ich zuerst die Filter bestimmen und dann anzuwenden. Ich denke, ich würde an einer right_semi_join Funktion interessiert sein, aber das existiert nicht.

Antwort

1

Verwenden Sie die ., um die Kettendaten in den zweiten Parameter und nicht in den ersten Parameter einzufügen.

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

Dank kommen mit! Jetzt, da ich weiß, dass es existiert, wird es viel einfacher sein, über mögliche Anwendungen dafür zu lesen! https://stackoverflow.com/questions/35272457/what-does-the-dplyr-period-character-reference – Bobby

2

Auswahl der Route mit den meisten Flügen ohne sehr viel

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 
Verwandte Themen