Saya mencoba membuat kombinasi unik dari semua elemen dari dua vektor dengan ukuran berbeda di R.
Misalnya, vektor pertama adalah
a <- c("ABC", "DEF", "GHI")
dan yang kedua adalah tanggal yang disimpan sebagai string saat ini
b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05")
Saya perlu membuat bingkai data dengan dua kolom seperti ini
> 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
Jadi pada dasarnya, saya mencari kombinasi unik dengan mempertimbangkan semua elemen dari satu vektor (a) disandingkan dengan semua elemen vektor kedua (b).
Solusi ideal akan menggeneralisasi ke lebih banyak vektor input.
Lihat juga:
Bagaimana membuat matriks kombinasi
plyr
melakukan semacam:result <- expand.grid(a=a,b=b); result <- result[order(result$a,result$b),];
expand.grid(b=b,a=a)[2:1]
The
tidyr
paket menyediakan bagus alternatifcrossing
, yang bekerja lebih baik daripada klasikexpand.grid
fungsi karena (1) string tidak diubah menjadi faktor dan (2) menyortir lebih intuitif: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
sumber
Hilang dalam hal ini r-faq ikhtisar adalah
CJ
-fungsi daritabel data-paket. Menggunakan:library(data.table) CJ(a, b, unique = TRUE)
memberikan:
CATATAN: karena versi 1.12.2
CJ
memberi nama otomatis kolom yang dihasilkan (lihat juga di sini dan di sini ).sumber
Sejak versi 1.0.0,
tidyr
menawarkan versinya sendiriexpand.grid()
. Ini melengkapi keluarga yang adaexpand()
,nesting()
dancrossing()
dengan fungsi tingkat rendah yang bekerja dengan vektor .Jika dibandingkan dengan
base::expand.grid()
: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
sumber
Anda dapat menggunakan fungsi order untuk mengurutkan sejumlah kolom. sebagai contoh Anda
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`
sumber