Je dois des dataframes a
et b
que je veux combiner dans un dataframe final c
error: Column names `city`, `detail` must not be duplicated. Use .name_repair to specify repair.
le dataframe c
devrait ressembler à
city.a detail.a city.b detail.b 1 a 1 x 5 2 a 1 y 6 3 b 2 x 5 4 b 2 y 6 5 c 3 x 5 6 c 3 y 6
Je pense que je pourrais utiliser le croisement depuis tidyr
mais pour croisement (a, b)
J'obtiens:
a <- data.frame(city=c("a","b","c"),detail=c(1,2,3)) b <- data.frame(city=c("x","y"),detail=c(5,6))
3 Réponses :
Oui, le croisement
est la bonne fonction, mais comme le message d'erreur suggère que les noms de colonnes ne doivent pas être dupliqués, essayez de changer les noms de colonnes
tidyr::expand_grid(a, b)
crossing
est un wrapper sur expand_grid
donc après avoir corrigé les noms, vous pouvez également l'utiliser directement.
names(a) <- paste0(names(a), ".a") names(b) <- paste0(names(b), ".b") tidyr::crossing(a, b) # city.a detail.a city.b detail.b # <fct> <dbl> <fct> <dbl> #1 a 1 x 5 #2 a 1 y 6 #3 b 2 x 5 #4 b 2 y 6 #5 c 3 x 5 #6 c 3 y 6
@ chinsoon12 Oui, est-ce équivalent à CJ
dans data.table
?
malheureusement, afaik, data.table :: CJ
ne peut toujours pas faire de jointure croisée
Voici une solution de base R en utilisant rep ()
+ cbind ()
, qui donne des noms de colonnes dupliqués:
> C city detail city.1 detail.1 1 a 1 x 5 2 a 1 y 6 3 b 2 x 5 4 b 2 y 6 5 c 3 x 5 6 c 3 y 6
tel que
C <- data.frame(a[rep(seq(nrow(a)),each = nrow(b)),],b,row.names = NULL)
Ou obtenir un bloc de données ayant des noms de colonnes différents en utilisant data.frame()
:
> C city detail city detail 1 a 1 x 5 2 a 1 y 6 3 b 2 x 5 4 b 2 y 6 5 c 3 x 5 6 c 3 y 6
Avec base R
, nous pouvons utiliser merge
merge(setNames(a, paste0(names(a), ".a")), b) # city.a detail.a city detail #1 a 1 x 5 #2 b 2 x 5 #3 c 3 x 5 #4 a 1 y 6 #5 b 2 y 6 #6 c 3 y 6