2015-10-07 2 views
1

Je dois créer des combinaisons en utilisant 'n' variables avec une valeur minimale de 5 & maximum de 80, avec une différence de x entre elles et la somme des valeurs pour chaque combinaison doit être égale à 100Fonction de création de combinaisons dans R

+0

quelle langue? – Bohemian

+1

Veuillez marquer avec la langue utilisée. –

+0

Vous semblez être la plupart du temps là (sauf pour la différence). De quoi avez-vous besoin d'aide exactement? –

Répondre

0

Pour n variables, vous devez transmettre une quantité variable de paramètres à expand.grid. Vous pouvez utiliser do.call pour cela:

combs = do.call(expand.grid, rep(list(seq(from = 5, to = 80, by = 5)), n)) 

Si vous souhaitez personnaliser les noms, vous devez les affecter séparément (via setNames). Par exemple, pour obtenir les noms m1 ... mn, utilisez:

values = rep(list(seq(from = 5, to = 80, by = 5)), n) 
names = paste0('m', seq_len(n)) 
combs = do.call(expand.grid, setNames(values, names)) 

De plus, je ne voudrais pas stocker le total de la même data.frame - utiliser une variable séparée:

total = rowSums(combs) 

... Mais Ce n'est même pas nécessaire.

mettre ensemble dans une définition de fonction:

my_combs = function (n, from, to, by, total) { 
    values = rep(list(seq(from, to, by)), n) 
    names = paste0('m', seq_len(n)) 
    combs = do.call(expand.grid, setNames(values, names)) 
    combs[rowSums(combs) == total, ] 
} 

Et vous l'appelez (par exemple) comme ceci:

result = my_combs(n = 2, from = 5, to = 80, by = 5, total = 100) 

Ce qui donne:

> result 
    m1 m2 
64 80 20 
79 75 25 
94 70 30 
109 65 35 
124 60 40 
139 55 45 
154 50 50 
169 45 55 
184 40 60 
199 35 65 
214 30 70 
229 25 75 
244 20 80 
+0

Génial! Comment est-ce que je peux imprimer toutes les combinaisons, seulement quelques-unes montrent, les autres sont omis? –

+0

@SagarRamsinghani Il imprime toutes les combinaisons. Vous êtes probablement confus par la numérotation des lignes. Le sous-ensemble que nous effectuons dans la dernière ligne ne touche pas les noms de ligne (qui sont des nombres). Ainsi, si nous filtrons la première ligne par exemple, la table résultante aura une première ligne dont le nom/numéro est différent. –

+0

ne sait pas où je vais mal: dynamique = fonction (4, 5, 80, 5, 100) { peignes = do.call (expand.grid, rep (liste (seq (5, 80, 5)), 4)) comb_total = rowSums (peignes) combs [comb_total == 100,] } –