Почему X [Y] соединение data.tables не допускает полное внешнее соединение или левое соединение?
Это немного философский вопрос о синтаксисе соединения data.table. Я нахожу все больше и больше использования для data.tables, но все еще учусь ...
Формат соединенияX[Y]
for data.tables очень лаконичен, удобен и эффективен, но, насколько я могу судить, он поддерживает только внутренние и правые внешние соединения. Чтобы получить левое или полное внешнее соединение, мне нужно использоватьmerge
:
X[Y, nomatch = NA]
-- all rows in Y -- right outer join (default)
X[Y, nomatch = 0]
-- only rows with matches in both X and Y -- inner join
merge(X, Y, all = TRUE)
-- all rows from both X and Y -- full outer join
merge(X, Y, all.x = TRUE)
-- all rows in X -- left outer join
Мне кажется, что было бы удобно, если быX[Y]
Формат объединения поддерживает все 4 типа объединений. Есть ли причина, по которой поддерживаются только два типа объединений?
Для меняnomatch = 0
а такжеnomatch = NA
Значения параметров не очень понятны для выполняемых действий. Мне легче понять и запомнитьmerge
синтаксис:all = TRUE
, all.x = TRUE
а такжеall.y = TRUE
, ПосколькуX[Y]
операция напоминаетmerge
намного больше, чемmatch
почему бы не использоватьmerge
синтаксис для объединений, а неmatch
Функция & APOS; snomatch
параметр?
Вот примеры кода 4 типов соединения:
# sample X and Y data.tables
library(data.table)
X <- data.table(t = 1:4, a = (1:4)^2)
setkey(X, t)
X
# t a
# 1: 1 1
# 2: 2 4
# 3: 3 9
# 4: 4 16
Y <- data.table(t = 3:6, b = (3:6)^2)
setkey(Y, t)
Y
# t b
# 1: 3 9
# 2: 4 16
# 3: 5 25
# 4: 6 36
# all rows from Y - right outer join
X[Y] # default
# t a b
# 1: 3 9 9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36
X[Y, nomatch = NA] # same as above
# t a b
# 1: 3 9 9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36
merge(X, Y, by = "t", all.y = TRUE) # same as above
# t a b
# 1: 3 9 9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36
identical(X[Y], merge(X, Y, by = "t", all.y = TRUE))
# [1] TRUE
# only rows in both X and Y - inner join
X[Y, nomatch = 0]
# t a b
# 1: 3 9 9
# 2: 4 16 16
merge(X, Y, by = "t") # same as above
# t a b
# 1: 3 9 9
# 2: 4 16 16
merge(X, Y, by = "t", all = FALSE) # same as above
# t a b
# 1: 3 9 9
# 2: 4 16 16
identical( X[Y, nomatch = 0], merge(X, Y, by = "t", all = FALSE) )
# [1] TRUE
# all rows from X - left outer join
merge(X, Y, by = "t", all.x = TRUE)
# t a b
# 1: 1 1 NA
# 2: 2 4 NA
# 3: 3 9 9
# 4: 4 16 16
# all rows from both X and Y - full outer join
merge(X, Y, by = "t", all = TRUE)
# t a b
# 1: 1 1 NA
# 2: 2 4 NA
# 3: 3 9 9
# 4: 4 16 16
# 5: 5 NA 25
# 6: 6 NA 36
Обновление: data.table v1.9.6 представилаon=
синтаксис, который допускает специальные объединения на полях, отличных от первичного ключа.ответ Янгорецкого на вопросКак объединить (объединить) фреймы данных (внутренний, внешний, левый, правый)? предоставляет некоторые примеры дополнительных типов соединений, которые может обрабатывать data.table.