将inner_join替换为semi_join

时间:2017-10-09 21:42:50

标签: r dplyr

以下代码按预期工作。执行直至head(1)行,我发现JFK到LAX是航班最多的航线。然后,我使用inner_join过滤flights表,仅包含此路线上的航班。这给了我11,252行。

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来实现相同目标?我希望有一行代码而不是使用临时变量。但是,如果我用temp变量写它,它看起来像这样。它给出了相同的结果:

  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函数感兴趣,但这不存在。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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"))