# Tidy Animated Verbs Garrick Aden-Buie – [@grrrck](https://twitter.com/grrrck) – [garrickadenbuie.com](https://www.garrickadenbuie.com) [![Binder](http://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/gadenbuie/tidy-animated-verbs/master?urlpath=rstudio) - Mutating Joins: [`inner_join()`](#inner-join), [`left_join()`](#left-join), [`right_join()`](#right-join), [`full_join()`](#full-join) - Filtering Joins: [`semi_join()`](#semi-join), [`anti_join()`](#anti-join) - Learn more about - [Relational Data](#relational-data) - [gganimate](#gganimate) ## Mutating Joins ``` r x #> # A tibble: 3 x 2 #> id x #> #> 1 1 x1 #> 2 2 x2 #> 3 3 x3 y #> # A tibble: 3 x 2 #> id y #> #> 1 1 y1 #> 2 2 y2 #> 3 4 y4 ``` ### Inner Join > All rows from `x` where there are matching values in `y`, and all > columns from `x` and `y`. ![](images/inner-join.gif) ``` r inner_join(x, y, by = "id") #> # A tibble: 2 x 3 #> id x y #> #> 1 1 x1 y1 #> 2 2 x2 y2 ``` ### Left Join > All rows from `x`, and all columns from `x` and `y`. Rows in `x` with > no match in `y` will have `NA` values in the new columns. ![](images/left-join.gif) ``` r left_join(x, y, by = "id") #> # A tibble: 3 x 3 #> id x y #> #> 1 1 x1 y1 #> 2 2 x2 y2 #> 3 3 x3 ``` ### Left Join (Extra Rows in y) > … If there are multiple matches between `x` and `y`, all combinations > of the matches are returned. ![](images/left-join-extra.gif) ``` r y_extra # has multiple rows with the key from `x` #> # A tibble: 4 x 2 #> id y #> #> 1 1 y1 #> 2 2 y2 #> 3 4 y4 #> 4 2 y5 left_join(x, y_extra, by = "id") #> # A tibble: 4 x 3 #> id x y #> #> 1 1 x1 y1 #> 2 2 x2 y2 #> 3 2 x2 y5 #> 4 3 x3 ``` ### Right Join > All rows from y, and all columns from `x` and `y`. Rows in `y` with no > match in `x` will have `NA` values in the new columns. ![](images/right-join.gif) ``` r right_join(x, y, by = "id") #> # A tibble: 3 x 3 #> id x y #> #> 1 1 x1 y1 #> 2 2 x2 y2 #> 3 4 y4 ``` ### Full Join > All rows and all columns from both `x` and `y`. Where there are not > matching values, returns `NA` for the one missing. ![](images/full-join.gif) ``` r full_join(x, y, by = "id") #> # A tibble: 4 x 3 #> id x y #> #> 1 1 x1 y1 #> 2 2 x2 y2 #> 3 3 x3 #> 4 4 y4 ``` ## Filtering Joins ### Semi Join > All rows from `x` where there are matching values in `y`, keeping just > columns from `x`. ![](images/semi-join.gif) ``` r semi_join(x, y, by = "id") #> # A tibble: 2 x 2 #> id x #> #> 1 1 x1 #> 2 2 x2 ``` ### Anti Join > All rows from `x` where there are not matching values in `y`, keeping > just columns from `x`. ![](images/anti-join.gif) ``` r anti_join(x, y, by = "id") #> # A tibble: 1 x 2 #> id x #> #> 1 3 x3 ``` ## Learn More ### Relational Data The [Relational Data](http://r4ds.had.co.nz/relation-data.html) chapter of the [R for Data Science](http://r4ds.had.co.nz/) book by Garrett Grolemund and Hadley Wickham is an excellent resource for learning more about relational data. The [dplyr two-table verbs vignette](https://dplyr.tidyverse.org/articles/two-table.html) and Jenny Bryan’s [Cheatsheet for dplyr join functions](http://stat545.com/bit001_dplyr-cheatsheet.html) are also great resources. ### gganimate The animations were made possible by the newly re-written [gganimate](https://github.com/thomasp85/gganimate#README) package by [Thomas Lin Pedersen](https://github.com/thomasp85) (original by [Dave Robinson](https://github.com/dgrtwo)). The [package readme](https://github.com/thomasp85/gganimate#README) provides an excellent (and quick) introduction to gganimte.