Pertanyaan R: menghasilkan semua permutasi vektor tanpa elemen duplikat [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Apakah ada cara langsung untuk menghasilkan semua permutasi yang mungkin dari vektor bilangan bulat (1 hingga maks 999) yang secara khusus mengecualikan elemen duplikat?

Misalnya, untuk vektor dengan tiga elemen dalam rentang 1 hingga 9 urutan 1 2 3 akan diterima, juga 1 2 9 tapi 1 2 2 akan menjadi tidak valid. Urutannya harus mengandung persis n elemen (dalam hal ini, tiga). EDIT: untuk menghindari kebingungan, urutannya signifikan, jadi 1 2 9 dan 9 2 1 keduanya valid dan diperlukan.

Ada banyak pertanyaan tentang permutasi dan kombinasi menggunakan R pada SO (seperti ini dan ini) tetapi tidak ada yang tampaknya cocok dengan kasus khusus ini. Saya berharap ada fungsi dasar R atau paket yang tidak jelas di luar sana yang akan mengurusnya tanpa saya harus menulis fungsi yang tidak memiliki selera.


9
2018-02-05 09:26


asal


Jawaban:


Menggunakan gtools paket:

require(gtools)
permutations(n = 9, r = 3, v = 1:9)
# n -> size of source vector
# r -> size of target vector
# v -> source vector, defaults to 1:n
# repeats.allowed = FALSE (default)

19
2018-02-05 09:29



EDIT: Ini bukan apa yang diminta OP, tapi saya tinggalkan jawaban ini, untuk menghindari kebingungan.

Matematika saya sedikit berkarat, tetapi saya pikir Anda menggambarkan kombinasi, bukan permutasi. Fungsi dasarcombn() mengembalikan kombinasi.

Saya mengilustrasikan dengan satu set yang dapat diatur - semua kombinasi panjang 3, dari vektor 1:4:

combn(4, 3)
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    2
[2,]    2    2    3    3
[3,]    3    4    4    4

Perbedaan antara combinations dan permutations adalah bahwa dalam combinations urutannya tidak masalah. Begitu, (2, 3, 4) dan (4, 3, 2) adalah kombinasi yang sama, tetapi permutasi yang berbeda.


9
2018-02-05 09:33



utils::combn  ; combinat::combn atau combinat::permn  adalah alternatif.


8
2018-02-05 13:14