Question

For instance , if the number is 100 and the number of groups is 4 it should give any random list of 4 numbers that add upto 100:

input number = 100

number of groups = 4

Possible outputs:

25, 25, 25, 25

10, 20, 30, 40

15, 35, 2, 48

The output should only be one list generated. More application oriented example would be how i would split a probability 1 into multiple groups given the number of groups using R?

Was it helpful?

Solution

rmultinom might be handy here:

x <- rmultinom(n = 1, size = 100, prob = rep(1/4, 4))
x
colSums(x)

Here I draw one vector, with a total size of 100, which is splitted into 4 groups.

OTHER TIPS

You can try following

total <- 100
n <- 4
as.vector(table(sample(1:n, size = total, replace = T)))
## [1] 23 27 24 26

as.vector(table(sample(1:n, size = total, replace = T)))
## [1] 25 26 28 21

as.vector(table(sample(1:n, size = total, replace = T)))
## [1] 24 20 28 28

When it comes to probabilities, I think this is a good idea:

generate.probabilities <- function(n){
    bordersR <- c(sort(runif(n-1)), 1)
    bordersL <- c(0, bordersR[1:(n-1)])
    bordersR - bordersL
}

It gives you n numbers from random distribution which sum up to 1.

Define the parameters for generality

inN <- 100 # input number
nG <- 4 # number of groups

Following storaged's idea that we only need 3 random numbers to split the space into 4 regions, but requiring integers, the inner borders can be found as:

sort(sample(inN,nG-1, replace = TRUE))

The OP wanted the count in each group which we can find by

diff(c(0,sort(sample(inN,nG-1, replace = TRUE)), inN))
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top