The mutating joins add columns from `y` to `x`, matching rows based on the keys:

* `inner_join()`: includes all rows in `x` and `y`. * `left_join()`: includes all rows in `x`. * `right_join()`: includes all rows in `y`. * `full_join()`: includes all rows in `x` or `y`.

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`.

inner_join(x, y, by = NULL, on = NULL)

left_join(x, y, by = NULL, on = NULL)

right_join(x, y, by = NULL, on = NULL)

full_join(x, y, by = NULL, on = NULL)

anti_join(x, y, by = NULL, on = NULL)

semi_join(x, y, by = NULL, on = NULL)

Arguments

x

A data.table

y

A data.table

by

(Optional) A character vector of variables to join by.

If `NULL`, the default, `*_join()` will perform a natural join, using all variables in common across `x` and `y`. A message lists the variables so that you can check they're correct; suppress the message by supplying `by` explicitly.

To join by different variables on `x` and `y`, use a named vector. For example, `by = c("a" = "b")` will match `x$a` to `y$b`.

To join by multiple variables, use a vector with length > 1. For example, `by = c("a", "b")` will match `x$a` to `y$a` and `x$b` to `y$b`. Use a named vector to match different variables in `x` and `y`. For example, `by = c("a" = "b", "c" = "d")` will match `x$a` to `y$b` and `x$c` to `y$d`.

on

(Optional) Indicate which columns in x should be joined with which columns in y. Examples included: 1..by = c("a","b") (this is a must for set_full_join); 2..by = c(x1="y1", x2="y2"); 3..by = c("x1==y1", "x2==y2"); 4..by = c("a", V2="b"); 5..by = .(a, b); 6..by = c("x>=a", "y<=b") or .by = .(x>=a, y<=b).

Value

A data.table

Examples

workers = fread(" name company Nick Acme John Ajax Daniela Ajax ") positions = fread(" name position John designer Daniela engineer Cathie manager ") workers %>% inner_join(positions)
#> Joining by: name
#> Key: <name> #> name company position #> <char> <char> <char> #> 1: Daniela Ajax engineer #> 2: John Ajax designer
workers %>% left_join(positions)
#> Joining by: name
#> Key: <name> #> name company position #> <char> <char> <char> #> 1: Daniela Ajax engineer #> 2: John Ajax designer #> 3: Nick Acme <NA>
workers %>% right_join(positions)
#> Joining by: name
#> Key: <name> #> name company position #> <char> <char> <char> #> 1: Cathie <NA> manager #> 2: Daniela Ajax engineer #> 3: John Ajax designer
workers %>% full_join(positions)
#> Joining by: name
#> Key: <name> #> name company position #> <char> <char> <char> #> 1: Cathie <NA> manager #> 2: Daniela Ajax engineer #> 3: John Ajax designer #> 4: Nick Acme <NA>
# filtering joins workers %>% anti_join(positions)
#> Joining by: name
#> name company #> <char> <char> #> 1: Nick Acme
workers %>% semi_join(positions)
#> Joining by: name
#> name company #> <char> <char> #> 1: John Ajax #> 2: Daniela Ajax
# To suppress the message, supply 'by' argument workers %>% left_join(positions, by = "name")
#> Key: <name> #> name company position #> <char> <char> <char> #> 1: Daniela Ajax engineer #> 2: John Ajax designer #> 3: Nick Acme <NA>
# Use a named 'by' if the join variables have different names positions2 = setNames(positions, c("worker", "position")) # rename first column in 'positions' workers %>% inner_join(positions2, by = c("name" = "worker"))
#> Key: <name> #> name company position #> <char> <char> <char> #> 1: Daniela Ajax engineer #> 2: John Ajax designer
# the syntax of 'on' could be a bit different workers %>% inner_join(positions2,on = "name==worker")
#> name company position #> <char> <char> <char> #> 1: John Ajax designer #> 2: Daniela Ajax engineer