1
votes

Générer par paire data.frame de toutes les combinaisons de deux data.frame avec un nombre différent de lignes

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


0 commentaires

3 Réponses :


2
votes

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


2 commentaires

@ chinsoon12 Oui, est-ce équivalent à CJ dans data.table ?


malheureusement, afaik, data.table :: CJ ne peut toujours pas faire de jointure croisée



1
votes

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


0 commentaires

1
votes

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


0 commentaires