[R] Drawing a sample based on certain condition

Rui Barradas
2025-04-14T13:04:36Z

?s 12:26 de 14/04/2025, Brian Smith escreveu:
> Hi,
>
> For my analytical work, I need to draw a sample of certain sample size
> from a denied population, where population members are marked by
> non-negative integers, such that sum of sample members if fixed. For
> example,
>
> Population = 0:100
> Sample_size = 10
> Sample_Sum = 20
>
> Under this setup if my sample members are X1, X2, ..., X10 then I
> should have X1+X2+...+X10 = 20
>
> Sample drawing scheme may be with/without replacement
>
> Is there any R function to achieve this? One possibility is to employ
> naive trial-error approach, but this doesnt seem to be practical as it
> would take long time to get the final sample with desired properties.
>
> Any pointer would be greatly appreciated.
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
https://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
Hello,

Use the multinomial distribution. The problem with this is that the
population is not part of the solution. But the sum is Sample_Sum.


Population <- 0:100
Sample_size <- 10
Sample_Sum <- 20

probs <- rep(1/Sample_size, Sample_size)

# one sample
rmultinom(1, Sample_Sum, prob = probs)
# five samples
rmultinom(5, Sample_Sum, prob = probs)


Another way, found on StackOverflow.


# user: https://stackoverflow.com/users/4996248/john-coleman
# answer: https://stackoverflow.com/a/49016614/8245406
rand.nums <- function(a,b,n,k){
   #finds n random integers in range a:b which sum to k
   while(TRUE){
     x <- sample(1:(k - n*a), n - 1, replace = TRUE) #cutpoints
     x <- sort(x)
     x <- c(x, k - n*a) - c(0, x)
     if(max(x) <= b - a) return(a + x)
   }
}

rand.nums(0, 100, Sample_size, Sample_Sum)


Hope this helps,

Rui Barradas


--
Este e-mail foi analisado pelo software antiv?rus AVG para verificar a presen?a
de v?rus.