2017-10-10 2 views
-1

Je veux faire une jointure à gauche avec 2 data.frames sur R, en utilisant la bibliothèque data.table. Ce que j'ai:Left join Fusionner data.table

library(data.table) 
id<-c("a1","a2","a3","a4") 
id2<-c("a2","a3","a1","a4") 
y<-c(1,2,3,4) 
z<-c(3,5,6,7) 
k<-c(1,3,8,7) 

df1<-data.table(id,y,z) 

id<-c("a2","a3","a1","a4") 
df2<-data.table(id,k,y) 

Je veux que le résultat est un nouveau cadre data.table, en étant le résultat d'une jointure LEFT JOIN, c'est:

result--> id,x,y,z 

J'utilise comme guide: https://rstudio-pubs-static.s3.amazonaws.com/52230_5ae0d25125b544caab32f75f0360e775.html

merge(df1,df2,by="id",all.x=TRUE) 

Mais cela me retourne:

id y.x z x y.y 
1: a1 1 3 3 3 
2: a2 2 5 0 1 
3: a3 3 6 2 2 
4: a4 4 7 1 4 

Le problème avec ceci est que la colonne y est dupliquée, et je veux que cela n'apparaisse qu'une seule fois.

J'ai essayé avec tous = FAUX, all.x = T, ... mais je ne réalise pas ce que je veux.

J'ai aussi essayé d'autres solutions, comme le propose: left join in data.table

setkey(df1,id) 
setkey(df2,id) 
df1[df2] 

Mais cette fois, dupliquer la colonne y.

id y z k i.y 
1: a1 1 3 8 3 
2: a2 2 5 1 1 
3: a3 3 6 3 2 
4: a4 4 7 7 4 

Comment puis-je le faire?

+0

Quelle est votre sortie désirée? –

+1

Pourquoi êtes-vous surpris? Vous avez la colonne y dans les deux tableaux. Comment R supposé savoir que tu ne veux qu'un seul d'entre eux? Et lequel? –

Répondre

1

Vous pouvez fusionner df1 et df2 en supprimant la colonne y dans l'un des tableaux. Essayez dplyr::left_join(df1, df2[, -c("y")], by = "id") ou merge(df1, df2[, -c("y")], by = "id").

+0

Ce n'est pas une bonne solution parce que j'ai plus de 2000 colonnes égales et le faire manuellement son dur !. Merci quand même – Jesus

+0

Si les colonnes sont vraiment identiques entre les tables, quelque chose comme ça devrait marcher 'fusionner (df1, df2)' (comme [ici] (https://stackoverflow.com/questions/22480836/merge-data-frame-but -keep-only-unique-columns), @thank Hardik gupta). Une autre option consiste à définir un vecteur contenant toutes les colonnes dupliquées avec 'colnames (df1) [(colnames (df1)% dans% colnames (df2))]' puis utiliser ce vecteur dans la fonction 'merge' (soit dans le argument 'by' ou sous-ensemble de l'une des tables). – ANG