2017-06-08 2 views
0

Quelle commande R génère toutes les combinaisons ordonnées possibles de longueur k?Fonction permettant de générer des combinaisons ordonnées

Par exemple de ce vecteur:

a,b,c,d 

Il veut générer toutes les combinaisons de longueur 3, mais seulement ceux où l'ordre est conservée:

a,b,c 
a,b,d 
a,c,d 
b,c,d 

Ou Si j'ai ce vecteur

a,b,7,d,e 

Je veux faire la même chose pour la longueur 2:

a,b 
a,7 
a,d 
a,e 
b,7 
b,d 
b,e 
7,d 
7,e 
d,e 

Combn ne fonctionne pas ici, car il vous donne toutes les combinaisons possibles, y compris celles renversées telles que
c, b
Dans les cas simples que je pourrais essayer de le faire avec expand.grid mais les deux méthodes devrait plus En traitement.
Peut-être qu'il existe une fonction de base (ou un paquet) capable de faire ce que je veux ou même d'accepter des conditions plus complexes. PD: Quand je dis «ordonné», je parle de l'ordre d'apparition dans le vecteur de départ. Je ne parle pas de l'ordre typographique, bien que dans mon exemple ils soient identiques.

+2

Si je fais ' combn (x, 3, FUN = toString) 'Il donne la sortie attendue - où' x <- lettres [1: 4] ' – Sotos

+0

ce https://stackoverflow.com/questions/21984830/creating-new-ids-two-way-from-two-vectors pourrait être d'intérêt pour votre question. – nadizan

Répondre

1

Vous pouvez utiliser combn dans la base R:

vec <- c("a", "b", "c", "d") 
len <- 2 
combn(length(vec), len, function(x) vec[x]) 

# [,1] [,2] [,3] [,4] [,5] [,6] 
#[1,] "a" "a" "a" "b" "b" "c" 
#[2,] "b" "c" "d" "c" "d" "d" 

de longueur 3:

combn(length(vec), 3, function(x) vec[x]) 

#  [,1] [,2] [,3] [,4] 
#[1,] "a" "a" "a" "b" 
#[2,] "b" "b" "c" "c" 
#[3,] "c" "d" "d" "d" 

OU comme @Sotos a souligné dans les commentaires:

combn(vec, len) 
+3

'combn (vec, 2)' donne la même sortie – Sotos