Einzigartige Kombination aller Elemente aus zwei (oder mehr) Vektoren

94

Ich versuche, eine einzigartige Kombination aller Elemente aus zwei Vektoren unterschiedlicher Größe in R zu erstellen.

Zum Beispiel ist der erste Vektor

a <- c("ABC", "DEF", "GHI")

und das zweite sind Daten, die derzeit als Zeichenfolgen gespeichert sind

b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05")

Ich muss einen Datenrahmen mit zwei Spalten wie dieser erstellen

> data
    a          b
1  ABC 2012-05-01
2  ABC 2012-05-02
3  ABC 2012-05-03
4  ABC 2012-05-04
5  ABC 2012-05-05
6  DEF 2012-05-01
7  DEF 2012-05-02
8  DEF 2012-05-03
9  DEF 2012-05-04
10 DEF 2012-05-05
11 GHI 2012-05-01
12 GHI 2012-05-02
13 GHI 2012-05-03
14 GHI 2012-05-04
15 GHI 2012-05-05

Im Grunde suche ich nach einer einzigartigen Kombination, indem ich alle Elemente eines Vektors (a) neben allen Elementen des zweiten Vektors (b) betrachte.

Eine ideale Lösung würde auf mehr Eingabevektoren verallgemeinern.


Siehe auch:
So generieren Sie eine Matrix von Kombinationen

Gödel
quelle

Antworten:

138

das ist vielleicht was du suchst

> expand.grid(a,b)
   Var1       Var2
1   ABC 2012-05-01
2   DEF 2012-05-01
3   GHI 2012-05-01
4   ABC 2012-05-02
5   DEF 2012-05-02
6   GHI 2012-05-02
7   ABC 2012-05-03
8   DEF 2012-05-03
9   GHI 2012-05-03
10  ABC 2012-05-04
11  DEF 2012-05-04
12  GHI 2012-05-04
13  ABC 2012-05-05
14  DEF 2012-05-05
15  GHI 2012-05-05

Wenn die resultierende Reihenfolge nicht Ihren Wünschen entspricht, können Sie sie anschließend sortieren. Wenn Sie die Argumente benennen expand.grid, werden sie zu Spaltennamen:

df = expand.grid(a = a, b = b)
df[order(df$a), ]

Und expand.gridverallgemeinert auf eine beliebige Anzahl von Eingabespalten.

shhhhimhuntingrabbits
quelle
4
Und ohne plyrnur eine Sortierung durchführen zu müssen:result <- expand.grid(a=a,b=b); result <- result[order(result$a,result$b),];
E-Mail
Kann jemand mit mehr Vertretern als ich diese Antwort akzeptieren?
Josh
Wenn Reihenfolge und Namen wie in der Frage sein sollten:expand.grid(b=b,a=a)[2:1]
GKi
Beachten Sie, dass der Titel "Eindeutige Kombinationen" lautet. Diese Antwort löst das OP-Problem. Wenn jedoch die beiden Spalten vom gleichen Datentyp sind und Sie expand.grid anwenden, haben Sie eindeutige Permutationen und keine eindeutigen Kombinationen
Brent,
27

Das tidyrPaket bietet die nette Alternative crossing, die besser funktioniert als die klassische expand.gridFunktion, da (1) Zeichenfolgen nicht in Faktoren umgewandelt werden und (2) die Sortierung intuitiver ist:

library(tidyr)

a <- c("ABC", "DEF", "GHI")
b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05")

crossing(a, b)

# A tibble: 15 x 2
       a          b
   <chr>      <chr>
 1   ABC 2012-05-01
 2   ABC 2012-05-02
 3   ABC 2012-05-03
 4   ABC 2012-05-04
 5   ABC 2012-05-05
 6   DEF 2012-05-01
 7   DEF 2012-05-02
 8   DEF 2012-05-03
 9   DEF 2012-05-04
10   DEF 2012-05-05
11   GHI 2012-05-01
12   GHI 2012-05-02
13   GHI 2012-05-03
14   GHI 2012-05-04
15   GHI 2012-05-05
Hypothese
quelle
13

Fehlt dabei Übersicht ist die CJ-Funktion aus dem-Paket. Verwenden von:

library(data.table)
CJ(a, b, unique = TRUE)

gibt:

      a          b
 1: ABC 2012-05-01
 2: ABC 2012-05-02
 3: ABC 2012-05-03
 4: ABC 2012-05-04
 5: ABC 2012-05-05
 6: DEF 2012-05-01
 7: DEF 2012-05-02
 8: DEF 2012-05-03
 9: DEF 2012-05-04
10: DEF 2012-05-05
11: GHI 2012-05-01
12: GHI 2012-05-02
13: GHI 2012-05-03
14: GHI 2012-05-04
15: GHI 2012-05-05

HINWEIS: Seit Version 1.12.2 CJwerden die resultierenden Spalten automatisch benannt (siehe auch hier und hier ).

Jaap
quelle
4

Seit Version 1.0.0 tidyrbietet eine eigene Version von expand.grid(). Es vervollständigt die vorhandene Familie von expand(), nesting()und crossing()mit einer Funktion auf niedriger Ebene, die mit Vektoren arbeitet .

Im Vergleich zu base::expand.grid():

Variiert das erste Element am schnellsten. Konvertiert niemals Zeichenfolgen in Faktoren. Fügt keine zusätzlichen Attribute hinzu. Gibt ein Tibble zurück, keinen Datenrahmen. Kann jeden verallgemeinerten Vektor erweitern, einschließlich Datenrahmen.

a <- c("ABC", "DEF", "GHI")
b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05")

tidyr::expand_grid(a, b)

   a     b         
   <chr> <chr>     
 1 ABC   2012-05-01
 2 ABC   2012-05-02
 3 ABC   2012-05-03
 4 ABC   2012-05-04
 5 ABC   2012-05-05
 6 DEF   2012-05-01
 7 DEF   2012-05-02
 8 DEF   2012-05-03
 9 DEF   2012-05-04
10 DEF   2012-05-05
11 GHI   2012-05-01
12 GHI   2012-05-02
13 GHI   2012-05-03
14 GHI   2012-05-04
15 GHI   2012-05-05
tmfmnk
quelle
2

Mit der Bestellfunktion können Sie eine beliebige Anzahl von Spalten sortieren. für dein Beispiel

df <- expand.grid(a,b)
> df
   Var1       Var2
1   ABC 2012-05-01
2   DEF 2012-05-01
3   GHI 2012-05-01
4   ABC 2012-05-02
5   DEF 2012-05-02
6   GHI 2012-05-02
7   ABC 2012-05-03
8   DEF 2012-05-03
9   GHI 2012-05-03
10  ABC 2012-05-04
11  DEF 2012-05-04
12  GHI 2012-05-04
13  ABC 2012-05-05
14  DEF 2012-05-05
15  GHI 2012-05-05

> df[order( df[,1], df[,2] ),] 
   Var1       Var2
1   ABC 2012-05-01
4   ABC 2012-05-02
7   ABC 2012-05-03
10  ABC 2012-05-04
13  ABC 2012-05-05
2   DEF 2012-05-01
5   DEF 2012-05-02
8   DEF 2012-05-03
11  DEF 2012-05-04
14  DEF 2012-05-05
3   GHI 2012-05-01
6   GHI 2012-05-02
9   GHI 2012-05-03
12  GHI 2012-05-04
15  GHI 2012-05-05`
Izan
quelle