Dlaczego X [Y] łączy dane.tables nie pozwala na pełne sprzężenie zewnętrzne lub łączenie lewe?

To jest nieco filozoficzne pytanie o składnię łączenia danych. Znajduję coraz więcej zastosowań dla data.tables, ale wciąż się uczę ...

Format łączeniaX[Y] dla data.tables jest bardzo zwięzły, poręczny i wydajny, ale o ile wiem, obsługuje tylko wewnętrzne sprzężenia i prawe sprzężenia zewnętrzne. Aby uzyskać lewe lub pełne połączenie zewnętrzne, muszę użyćmerge:

X[Y, nomatch = NA] - wszystkie wiersze w Y - prawe sprzężenie zewnętrzne (domyślnie)X[Y, nomatch = 0] - tylko wiersze z dopasowaniami w X i Y - sprzężenie wewnętrznemerge(X, Y, all = TRUE) - wszystkie wiersze zarówno X, jak i Y - pełne sprzężenie zewnętrznemerge(X, Y, all.x = TRUE) - wszystkie wiersze w X - lewe sprzężenie zewnętrzne

Wydaje mi się, że byłoby to przydatne, gdybyX[Y] Format łączenia obsługiwał wszystkie 4 typy złączeń. Czy istnieje powód, dla którego obsługiwane są tylko dwa typy złączeń?

Dla mnienomatch = 0 inomatch = NA wartości parametrów nie są zbyt intuicyjne dla wykonywanych działań. Łatwiej jest mi zrozumieć i zapamiętaćmerge składnia:all = TRUE, all.x = TRUE iall.y = TRUE. OdX[Y] operacja przypominamerge o wiele więcej niżmatch, dlaczego nie użyćmerge składnia złączeń, a niematch Funkcjenomatch parametr?

Oto przykłady kodu 4 typów połączeń:

# 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

Aktualizacja: data.table v1.9.6 wprowadziłaon=&nbsp;składnia, która umożliwia połączenia ad hoc na polach innych niż klucz podstawowy.odpowiedź jangoreckiego&nbsp;do pytaniaJak dołączyć (scalić) ramki danych (wewnętrzne, zewnętrzne, lewe, prawe)?&nbsp;podaje kilka przykładów dodatkowych typów łączenia, które może obsługiwać data.table.