J'essaie de créer une fonction qui répartira un nombre dans un nombre X de groupes qui sont à peu près égaux. Par exemple, diviser 32 en 3 groupes distincts donnerait 11, 11 et 10. Diviser 32 en 5 groupes distincts donnerait 7, 7, 6, 6, 6.
J'ai trouvé beaucoup d'approches Python, et j'ai trouvé beaucoup d'approches R qui divisent les échantillons. Mais, je n'ai trouvé aucune approche spécifique R qui se concentre sur le fractionnement d'un nombre spécifique plutôt que d'un échantillon.
Toute aide serait très appréciée!
3 Réponses :
Vous pourriez faire:
split_count <- function(x, n){ grp <- rep(x%/%n, n) y <- x%%n grp[seq_len(y)] <- grp[seq_len(y)] + 1 grp } split_count(32, 2) [1] 16 16 split_count(32, 5) [1] 7 7 6 6 6 split_count(32, 3) [1] 11 11 10
Une transcription d'un code python
fourni par @Poe Dator:
int_split <- function(n, p) n %/% p + (sequence(p) - 1 < n %% p) int_split(32, 3) [1] 11 11 10 int_split(32, 5) [1] 7 7 6 6 6
Voici une approche «Monte Carlo». Je génère un groupe ( N
) d'entiers aléatoires (taille = grps
) qui se résument à Num
, puis je choisis la combinaison avec le moins de différence.
Num <- 32 grps <- 4 N <- 1000 tmp <- rmultinom(N,Num,rep(1/grps,grps)) i <- which.min(apply(tmp,2,function(x) sum(abs(diff(x))))) tmp[,i]
Cela n'aurait-il pas aussi de nombreuses autres combinaisons, c'est-à-dire
7 7 7 7 4
Il y a beaucoup de combinaisons possibles, mais j'aimerais donner la priorité à les rendre aussi égales que possible (c'est-à-dire par 1 dans les groupes).
pourriez-vous inclure les liens python / r que vous avez trouvés?
Salut Onyambu, cette réponse en Ruby était assez sympa .. stackoverflow.com/a/36415500/7700147