1
votes

Création d'une fonction pour diviser un nombre unique en groupes approximativement égaux R

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!

r

4 commentaires

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


3 Réponses :


1
votes

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


0 commentaires

2
votes

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


0 commentaires

1
votes

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]


0 commentaires