1
votes

Combinez seulement différentes lignes en r

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 commentaires

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)


3 Réponses :


2
votes

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, ])


2 commentaires

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.



3
votes

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)


0 commentaires

4
votes

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 >


0 commentaires