2013-02-05 16 views
9

Esiste un modo semplice per generare tutte le possibili permutazioni di un vettore di numeri interi (da 1 a massimo 999) che esclude specificamente gli elementi duplicati?R: genera tutte le permutazioni del vettore senza elementi duplicati

Ad esempio, per un vettore con tre elementi in una gamma da 1 a 9, la sequenza 1 2 3 sarebbe accettabile, come sarebbe 1 2 9 ma 1 2 2 sarebbe valida. La sequenza deve contenere esattamente gli elementi n (in questo caso, tre). EDIT: per evitare confusione, l'ordine è significativo, quindi 1 2 9 e 9 2 1 sono entrambi validi e obbligatori.

Ci sono molte domande su permutazioni e combinazioni che usano R su SO (come this e this) ma nessuna sembra adattarsi a questo caso particolare. Spero che là fuori ci sia una oscura funzione R o pacchetto che si prenderà cura di me senza che io debba scrivere una funzione sgraziata da solo.

+0

Sì, l'ordine è importante così come gli elementi stessi. – SlowLearner

+2

Bene, la risposta senza il chiarimento modificato era sicuramente 'sample' e sono sicuro che si tratta di un duplicato, ma il duplicato citato non è una buona risposta. –

+0

Come avvertimento per coloro che seguono: il numero di permutazioni di elementi 'n' è' n! ', Che diventa molto veloce. Per i 999 elementi menzionati in questa domanda ci sono circa 4 * 10^2564 permutazioni. – Gregor

risposta

19

Utilizzando gtools pacchetto:

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

EDIT: Questo non è ciò che ha chiesto il PO per, ma lascio questa risposta, per evitare confusione.

La mia matematica è un po 'arrugginita, ma penso che stiate descrivendo combinazioni, non permutazioni. La funzione di base combn() restituisce combinazioni.

I illustrano con un insieme gestibile - tutte le combinazioni di lunghezza 3, dal vettore 1:4:

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

La differenza tra combinations e permutations è che in combinations l'ordine non importa. Quindi, (2, 3, 4) e (4, 3, 2) è la stessa combinazione, ma diverse permutazioni.

+0

Non sono possibili tutte le permutazioni, vero? ex: (4,3,2) non è qui ...? – Arun

+0

@Andrie Sono certo che la mia matematica sia più rustica. Ma quanto sopra non richiede un controllo dopo la generazione per rimuovere i duplicati? O dovrei leggere le colonne piuttosto che attraverso le righe della matrice sopra? – SlowLearner

+2

@SlowLearner, dovresti leggere le colonne. Quindi, stavi cercando delle combinazioni ..? – Arun

7

utils::combn; combinat::combn o combinat::permn sono alternative.

Problemi correlati