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

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.


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

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


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

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`
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.