J'ai deux data.frames similaires à ceux-ci:
#Dt.final Id Date Weight late 4 4 30 NA 5 6 40 NA 8 5 10 6
et
#DT2 Id Date Weight late 1 2 10 3 2 3 20 4 3 4 30 5 8 5 10 6
Je voudrais fusionner ces fichiers en considérant uniquement le ID différent entre eux comme ceci:
#Dt1 Id Date Weight 1 2 10 2 3 20 3 4 30 4 4 30 5 6 40
Mes fichiers originaux sont plus gros que ceux-ci, merci.
3 Réponses :
peut-être que cela peut résoudre votre problème, c'est une réponse faite à la main mais j'espère pas trop mal:
df_1 <- data.frame(ID = factor(1:5, levels=1:8), Date = c(2, 3, 4, 4, 6), Weight = c(10, 20, 20, 30, 40)) df_2 <- data.frame(ID = factor(4:8, levels=1:8), Date = c(2, 3, 4, 4, 6), Weight = c(10, 20, 20, 30, 40), late = c(1, 2, 3, 4, 5)) # Temporary dataframe df_temp <- data.frame( df_1[!df_1$ID %in% df_2$ID, ], late = NA) df.final <- rbind( df_temp, df_2[!df_2$ID %in% df_1$ID, ])
Il ne génère pas la sortie souhaitée par OP.
Ok, ce n'est pas exactement la même entrée. Merci pour votre réponse en utilisant dplyr.
Recherchez-vous quelque chose comme ceci?
library(dplyr) #> #> Attaching package: 'dplyr' #> The following objects are masked from 'package:stats': #> #> filter, lag #> The following objects are masked from 'package:base': #> #> intersect, setdiff, setequal, union df1 <- data.frame(Id = c(1, 2, 3, 4, 5), Date = c(2, 3, 4, 4, 6), Weight = c(10, 20, 30, 30, 40)) df2 <- data.frame(Id = c(1, 2, 3, 8), Date = c(2, 3, 4, 5), Weight = c(10, 20, 30, 10), late = c(3, 4, 5, 6)) full_join(x = filter(.data = df1, Id %in% setdiff(x = df1$Id, y = df2$Id)), y = filter(.data = df2, Id %in% setdiff(x = df2$Id, y = df1$Id))) #> Joining, by = c("Id", "Date", "Weight") #> Id Date Weight late #> 1 4 4 30 NA #> 2 5 6 40 NA #> 3 8 5 10 6
Créé le 03/05/2019 par le paquet reprex (v0.2.1)
Outre la réponse @yarnabrina, l ' anti_join
dans dplyr
est également ce dont vous avez besoin, mais nous devons appliquer deux fois. anti_join (x, y)
supprime toutes les obs dans x
qui ont une correspondance dans y
:
> full_join(anti_join(df1, df2, by = 'Id'), anti_join(df2, df1, by = 'Id')) Joining, by = c("Id", "Date", "Weight") Id Date Weight late 1 4 4 30 NA 2 5 6 40 NA 3 8 5 10 6
p >
Ne marche pas. @ user1945827
Vous allez rencontrer des problèmes avec le nombre différent de colonnes.
Copie possible de Comment joindre (fusionner) des cadres de données ( intérieur, extérieur, gauche, droite)