Fusion data.frame sans doublons
Bonjour à tous !
J'ai 4 data frames de la forme
Citation:
a b c
1 2 3
2 3 4
4 5 6
et j'aimerai les fusionner en un seul mais sans des doublons sur la première colonne ie si
Code:
1 2 3 4 5 6
| data.frame1 =
a b c
1 2 3
2 3 4
4 5 6 |
et
Code:
1 2 3 4 5 6
| data.frame2 =
a b c
1 4 6
3 3 4
5 5 6 |
cela devienne :
Citation:
a b c
1 2 3
2 3 4
4 5 6
3 3 4
5 5 6
J'ai essayée une méthode qui consiste à fusionner les 4 data.frames avec merge dans un data.frame "all".
ensuite j'ai fait doublons<-which(duplicated(all$column1))
puis all<-all[-doublons,]
mais cela n'a pas fonctionné.
De plus, une fois que j'aurai obtenu mon data.frame final "all", j'aimerai le fusionner avec un autre data.frame "tab", sous la condition que si un élément de la colonne 1 de "all"=un élément de la colonne 1 de "tab " alors on garde les autres colonnes et on les mets les unes à la suite des autres.
Code:
1 2 3 4 5 6 7 8 9 10 11
| all=
a b c
1 4 6
3 3 4
5 5 6
tab=
a e f
1 7 5
2 9 8
5 9 2 |
Devienne
Citation:
a b c e f
1 4 6 7 5
5 5 6 9 2
Est ce que vous auriez des idées ? (J'espère avoir été assez claire...)
Merci beaucoup !
Fusion data.frame sans doublons
Bonjour,
• Une proposition intuitive pour la première partie :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| > df1 <- data.frame(a=c(1,2,4),b=c(2,3,5),c=c(3,4,6))
> df1
a b c
1 1 2 3
2 2 3 4
3 4 5 6
> df2 <- data.frame(a=c(1,3,5),b=c(4,3,5),c=c(6,4,6))
> df2
a b c
1 1 4 6
2 3 3 4
3 5 5 6 |
Code:
1 2 3 4 5 6 7 8
| > all <- merge(df2,df1,by="a",all=T, suffixes=c("",".update"))
> all
a b c b.update c.update
1 1 4 6 2 3
2 2 NA NA 3 4
3 3 3 4 NA NA
4 4 NA NA 5 6
5 5 5 6 NA NA |
Code:
1 2 3 4 5 6 7 8 9 10 11
| > all$b <- ifelse(!is.na(all$b.update),all$b.update,all$b)
> all$c <- ifelse(!is.na(all$c.update),all$c.update,all$c)
> all$b.update <- NULL
> all$c.update <- NULL
> all
a b c
1 1 2 3
2 2 3 4
3 3 3 4
4 4 5 6
5 5 5 6 |
• Une autre proposition plus générale :
Code:
1 2
| > df1 <- data.frame(a=c(1,2,4),b=c(2,3,5),c=c(3,4,6))
> df2 <- data.frame(a=c(1,3,5),b=c(4,3,5),c=c(6,4,6)) |
Création des observations manquantes dans df2 :
Code:
1 2 3 4 5 6 7 8
| > df2 <- merge(df2,df1["a"],by="a",all=TRUE)
> df2
a b c
1 1 4 6
2 2 NA NA
3 3 3 4
4 4 NA NA
5 5 5 6 |
Mise à jour de df2 avec df1 :
Code:
1 2 3 4 5 6 7 8 9 10 11
| > library(data.table)
> Cols <- names(df1)[-1]
> iCols <- paste0("i.", Cols)
> all <- setDT(df2)[df1, (Cols) := mget(iCols), on="a"][]
> all
a b c
1: 1 2 3
2: 2 3 4
3: 3 3 4
4: 4 5 6
5: 5 5 6 |
• La deuxième partie ne pose pas de problème particulier :
Code:
1 2 3 4 5 6
| > tab <- data.frame(a=c(1,2,5),e=c(7,9,9),f=c(5,8,2))
> tab
a e f
1 1 7 5
2 2 9 8
3 5 9 2 |
Code:
1 2 3 4 5 6
| > all <- merge(all,tab,by="a")
> all
a b c e f
1 1 2 3 7 5
2 2 3 4 9 8
3 5 5 6 9 2 |
Cordialement,