Por que X [Y] join de data.tables não permite uma junção externa completa ou uma junção esquerda?

Esta é uma questão filosófica sobre data.table join syntax. Eu estou achando mais e mais usos para data.tables, mas ainda aprendendo ...

O formato de associaçãoX[Y] para data.tables é muito conciso, prático e eficiente, mas tanto quanto eu posso dizer, ele só suporta junções internas e junções externas à direita. Para obter uma junção externa completa ou esquerda, preciso usarmerge:

X[Y, nomatch = NA] - todas as linhas em Y - junção externa direita (padrão)X[Y, nomatch = 0] - somente linhas com correspondências em X e Y - junção internamerge(X, Y, all = TRUE) - todas as linhas de X e Y - junção externa completamerge(X, Y, all.x = TRUE) - todas as linhas no X - junção externa esquerda

Parece-me que seria útil se oX[Y] O formato de junção suportou todos os 4 tipos de junções. Existe uma razão pela qual apenas dois tipos de junções são suportados?

Para mim, onomatch = 0 enomatch = NA os valores dos parâmetros não são muito intuitivos para as ações que estão sendo executadas. É mais fácil para mim entender e lembrar omerge sintaxe:all = TRUE, all.x = TRUE eall.y = TRUE. Desde oX[Y] operação se assemelhamerge Muito mais quematch, porque não usar omerge sintaxe para junções ao invés domatch funçõesnomatch parâmetro?

Aqui estão exemplos de código dos 4 tipos de junção:

# 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

Atualização: data.table v1.9.6 introduziu oon= sintaxe, que permite junções ad hoc em campos diferentes da chave primária.jangorecki's answer para a questãoComo juntar (mesclar) quadros de dados (interno, externo, esquerdo, direito)? fornece alguns exemplos de tipos de junção adicionais que o data.table pode manipular.

questionAnswers(3)

yourAnswerToTheQuestion