İki (veya daha fazla) vektörden tüm öğelerin benzersiz kombinasyonu


100

R'deki farklı boyuttaki iki vektörden tüm öğelerin benzersiz bir kombinasyonunu oluşturmaya çalışıyorum.

Örneğin, ilk vektör

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

ve ikincisi, şu anda dizeler olarak depolanan tarihlerdir

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

Bunun gibi iki sütun içeren bir veri çerçevesi oluşturmam gerekiyor

> 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

Yani temel olarak, bir vektörün (a) tüm elemanlarını ikinci vektörün (b) tüm elemanlarıyla yan yana getirerek benzersiz bir kombinasyon arıyorum.

İdeal bir çözüm, daha fazla girdi vektörüne genelleme yapacaktır.


Ayrıca bkz:
Bir kombinasyon matrisi nasıl oluşturulur

Yanıtlar:


145

bu belki de peşinde olduğun şey

> 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

Ortaya çıkan sıra istediğiniz gibi değilse, daha sonra sıralayabilirsiniz. Bağımsız değişkenleri olarak adlandırırsanız expand.grid, bunlar sütun adları olur:

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

Ve expand.gridherhangi bir sayıda giriş sütununa genelleştirir.


4
Ve plyrbir sıralama yapmanıza gerek kalmadan :result <- expand.grid(a=a,b=b); result <- result[order(result$a,result$b),];
posta

benden daha fazla itibara sahip biri bu cevabı kabul edebilir mi?
Josh

Sıra ve adlar sorudaki gibi olmalıdır:expand.grid(b=b,a=a)[2:1]
GKi

Başlığın Benzersiz Kombinasyonlar olduğuna dikkat edin - bu yanıt OP sorununu çözer, ancak 2 sütun aynı veri türündeyse ve expand.grid'i uygularsanız, benzersiz kombinasyonlara değil benzersiz permütasyonlara sahip olacaksınız
Brent

31

tidyrPaket güzel bir alternatif sunmaktadır crossingklasik daha iyi çalışıyor, expand.grid(1) dizeleri faktörleri dönüşmemiş ve (2) sıralama daha sezgisel çünkü fonksiyonu:

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

Bunda eksik genel bakış CJ gelen taşımasının avantajlı-paket. Kullanarak:

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

verir:

      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

NOT: sürüm 1.12.2 CJ, sonuçtaki sütunları otomatik olarak adlandırdığından (ayrıca buraya ve buraya bakın ).


5

1.0.0 sürümünden bu yana tidyr, kendi expand.grid(). Bu mevcut ailesini tamamlar expand(), nesting()ve crossing()düşük düzeyli bir fonksiyonu ile o eserler vektörler ile .

Şununla karşılaştırıldığında base::expand.grid():

İlk öğeyi en hızlı değiştirir. Dizeleri asla faktörlere dönüştürmez. Herhangi bir ek özellik eklemez. Veri çerçevesi değil, bir tibble döndürür. Veri çerçeveleri dahil herhangi bir genelleştirilmiş vektörü genişletebilir.

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

3

istediğiniz sayıda sütunu sıralamak için sıralama işlevini kullanabilirsiniz. senin örneğin için

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`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.