data.table
based implementation.
# S3 method for relop_natural_join
ex_data_table_step(
optree,
...,
tables = list(),
source_usage = NULL,
source_limit = NULL,
env = parent.frame()
)
relop operations tree.
not used, force later arguments to bind by name.
named list map from table names used in nodes to data.tables and data.frames.
list mapping source table names to vectors of columns used.
if not null limit all table sources to no more than this many rows (used for debugging).
environment to work in.
d1 <- build_frame(
"key", "val", "val1" |
"a" , 1 , 10 |
"b" , 2 , 11 |
"c" , 3 , 12 )
d2 <- build_frame(
"key", "val", "val2" |
"a" , 5 , 13 |
"b" , 6 , 14 |
"d" , 7 , 15 )
# key matching join
optree <- natural_join(local_td(d1), local_td(d2),
jointype = "FULL", by = 'key')
ex_data_table(optree)
#> key val val1 val2
#> 1 a 1 10 13
#> 2 b 2 11 14
#> 3 c 3 12 NA
#> 4 d 7 NA 15
# full cross-product join
# (usually with jointype = "FULL", but "LEFT" is more
# compatible with rquery field merge semantics).
optree2 <- natural_join(local_td(d1), local_td(d2),
jointype = "LEFT", by = NULL)
ex_data_table(optree2)
#> key val val1 val2
#> 1 a 1 10 13
#> 2 a 1 10 14
#> 3 a 1 10 15
#> 4 b 2 11 13
#> 5 b 2 11 14
#> 6 b 2 11 15
#> 7 c 3 12 13
#> 8 c 3 12 14
#> 9 c 3 12 15
# notice ALL non-"by" fields take coalese to left table.