Filtering joins filter rows from x based on the presence or absence of matches in y:
semi_join() return all rows from x with a match in y.
anti_join() return all rows from x without a match in y.
# "Filtering" joins keep cases from the LHS
band_members %>% semi_join(band_instruments)
#> Joining, by = "name"
#> # A tibble: 2 x 2
#> name band
#> <chr> <chr>
#> 1 John Beatles
#> 2 Paul Beatles
band_members %>% anti_join(band_instruments)
#> Joining, by = "name"
#> # A tibble: 1 x 2
#> name band
#> <chr> <chr>
#> 1 Mick Stones
semi_join
只返回x表格中中可以跟y表格匹配的行,anti_join
返回x表格中与y表格不匹配的行。
nest_join() returns all rows and columns in x with a new nested-df column that contains all matches from y. When there is no match, the list column is a 0-row tibble.
nest_join()
类似left_join()
,返回的形式不一样。
band_members %>% nest_join(band_instruments)
#> Joining, by = "name"
#> # A tibble: 3 x 3
#> name band band_instruments
#> <chr> <chr> <list>
#> 1 Mick Stones <tibble [0 × 1]>
#> 2 John Beatles <tibble [1 × 1]>
#> 3 Paul Beatles <tibble [1 × 1]>
把nest_join
之后,band_instruments的结果打印出来
[[1]]
# A tibble: 0 x 1
# … with 1 variable: plays <chr>
[[2]]
# A tibble: 1 x 1
plays
<chr>
1 guitar
[[3]]
# A tibble: 1 x 1
plays
<chr>
1 bass
对比left_join
> band_members %>% left_join(band_instruments)
Joining, by = "name"
# A tibble: 3 x 3
name band plays
<chr> <chr> <chr>
1 Mick Stones NA
2 John Beatles guitar
3 Paul Beatles bass