¿Por qué X [Y] se une a data.tables no permite una combinación externa completa, o una combinación izquierda?

Esta es una pequeña pregunta filosófica sobre la sintaxis de datos y tablas. Estoy encontrando más y más usos para data.tables, pero todavía estoy aprendiendo ...

El formato de uniónX[Y] para data.tables es muy conciso, práctico y eficiente, pero por lo que puedo decir, solo admite uniones internas y uniones externas correctas. Para obtener una combinación externa izquierda o completa, necesito usarmerge:

X[Y, nomatch = NA] - todas las filas en Y - unión externa derecha (predeterminado)X[Y, nomatch = 0] - solo filas con coincidencias en X e Y - unión internamerge(X, Y, all = TRUE) - todas las filas de X e Y - unión externa completamerge(X, Y, all.x = TRUE) - todas las filas en X - unión externa izquierda

Me parece que sería útil si elX[Y] formato de unión compatible con los 4 tipos de combinaciones. ¿Hay alguna razón por la que solo se admiten dos tipos de combinaciones?

Para mí, elnomatch = 0 ynomatch = NA Los valores de los parámetros no son muy intuitivos para las acciones que se realizan. Es más fácil para mí entender y recordar elmerge sintaxis:all = TRUE, all.x = TRUE yall.y = TRUE. Desde elX[Y] operación se asemejamerge mucho mas quematch, ¿por qué no usar elmerge sintaxis para uniones en lugar de lamatch función denomatch ¿parámetro?

Aquí hay ejemplos de código de los 4 tipos de unión:

# 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

Actualización: data.table v1.9.6 introdujo elon= sintaxis, que permite uniones ad hoc en campos distintos a la clave principal.la respuesta de jangorecki a la pregunta¿Cómo unir (combinar) marcos de datos (interno, externo, izquierdo, derecho)? proporciona algunos ejemplos de tipos de unión adicionales que puede manejar data.table.

Respuestas a la pregunta(3)

Su respuesta a la pregunta