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= składnia, która umożliwia połączenia ad hoc na polach innych niż klucz podstawowy.odpowiedź jangoreckiego do pytaniaJak dołączyć (scalić) ramki danych (wewnętrzne, zewnętrzne, lewe, prawe)? podaje kilka przykładów dodatkowych typów łączenia, które może obsługiwać data.table.

questionAnswers(3)

yourAnswerToTheQuestion