Warum erlaubt X [Y] Join von data.tables keinen vollständigen Outer Join oder Left Join?

Dies ist eine philosophische Frage zur Join-Syntax von data.table. Ich finde immer mehr Anwendungen für data.tables, lerne aber immer noch ...

Das Join-FormatX[Y] Denn data.tables ist sehr übersichtlich, praktisch und effizient, aber soweit ich das beurteilen kann, werden nur innere und rechte äußere Joins unterstützt. Um eine linke oder vollständige äußere Verknüpfung zu erhalten, muss ich verwendenmerge:

X[Y, nomatch = NA] - alle Zeilen in Y - rechter Outer Join (Standard)X[Y, nomatch = 0] - Nur Zeilen mit Übereinstimmungen in X und Y - Innerer Joinmerge(X, Y, all = TRUE) - Alle Zeilen von X und Y - Vollständige äußere Verknüpfungmerge(X, Y, all.x = TRUE) - Alle Zeilen in X - Linke äußere Verknüpfung

Es scheint mir, dass es praktisch wäre, wenn dieX[Y] Join-Format unterstützt alle 4 Arten von Joins. Gibt es einen Grund, warum nur zwei Arten von Joins unterstützt werden?

Für mich ist dasnomatch = 0 undnomatch = NA Parameterwerte sind für die ausgeführten Aktionen nicht sehr intuitiv. Es fällt mir leichter, das zu verstehen und mich daran zu erinnernmerge Syntax:all = TRUE, all.x = TRUE undall.y = TRUE. Seit derX[Y] Bedienung ähneltmerge viel mehr alsmatch, warum nicht diemerge Syntax für Joins anstelle vonmatch Funktion istnomatch Parameter?

Hier sind Codebeispiele für die 4 Verknüpfungstypen:

# 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

Update: In data.table v1.9.6 wurde dason= Syntax, die Ad-hoc-Verknüpfungen mit anderen Feldern als dem Primärschlüssel ermöglicht.jangoreckis antwort zur FrageWie werden Datenrahmen (innen, außen, links, rechts) zusammengefügt (zusammengeführt)? Bietet einige Beispiele für zusätzliche Verknüpfungstypen, die data.table verarbeiten kann.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage