C'est un peu une question philosophique sur les données.le tableau de la syntaxe de jointure. Je viens de trouver de plus en plus de données.tables, mais encore à apprendre...
La jointure format X[Y]
pour les données.les tables est très concis, pratique et efficace, mais aussi loin que je peux dire, il prend uniquement en charge les jointures internes et en droit des jointures externes. Pour obtenir de gauche ou de jointure externe complète, j'ai besoin d'utiliser de fusion:
-
X[Y,nomatch=NA]
-- toutes les lignes Y -- jointure externe droite (par défaut) -
X[Y,nomatch=0]
-- seules les lignes avec des allumettes dans les directions X et Y -- jointure interne -
merge(X,Y,all=TRUE)
-- toutes les lignes de X et de Y -- jointure externe complète -
merge(X,Y,all.x=TRUE)
-- toutes les lignes de X -- jointure externe gauche
Il me semble qu'il serait pratique si X[Y] joindre format pris en charge tous les 4 types de jointures. Est-il une raison que deux types de jointures sont pris en charge?
Pour moi, le "nomatch=0" et "nomatch=NA" les valeurs de paramètre ne sont pas très intuitif pour les actions effectuées. Il est plus facile pour moi de comprendre et de mémoriser la fusion de la syntaxe: "tous les=TRUE", "tous les.x=TRUE" et "tous les.y=TRUE". Depuis le X[Y] opération ressemble de fusion beaucoup plus de match, pourquoi ne pas utiliser la fusion de la syntaxe pour les jointures plutôt que le match de la fonction de nomatch paramètre?
Voici des exemples de code de la 4 types de jointure:
# 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
6 votes
Avez-vous lu FAQ 1.12 ? Vous pouvez toujours appeler
Y[X]
si vous voulez que le jointure externe gauche deX[Y]
yrbind(Y[X],X[Y])
si vous voulez une jointure externe complète0 votes
Voir ma réponse pour une approche plus data.table de la jointure externe complète.
0 votes
@mnel, je suppose que votre
unique()
l'approche ci-dessous pour la jointure complète est préférable àrbind(Y[X],X[Y])
puisque le rbind impliquerait de copier la table. C'est bien cela ?0 votes
Pour autant que je sache, oui. Je n'ai pas testé si trois petits appels uniques sont plus rapides qu'un grand appel (par ex.
unique(c(unique(X[,t]), unique(Y[,t]))
-- Cette méthode devrait être plus efficace en termes de mémoire car elle ne combine que deux listes qui seront inférieures ou égales au nombre de lignes dans X et Y.3 votes
Votre question décrit si bien la situation ; j'y ai trouvé des réponses à mes questions. Merci