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üpfungEs 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.