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
Répondre
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
Génial! Comment est-ce que je peux imprimer toutes les combinaisons, seulement quelques-unes montrent, les autres sont omis? –
@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. –
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,] } –
quelle langue? – Bohemian
Veuillez marquer avec la langue utilisée. –
Vous semblez être la plupart du temps là (sauf pour la différence). De quoi avez-vous besoin d'aide exactement? –