0
votes

I'm looking to generate a random number sequence with 14 numbers between 1 & 25 (inclusive). Which I can do in R using > sample (1:25, 14). However, for some of the sequences I need certain numbers excluded (2,3,4,5,6,16,21,etc.). I also need to make sure certain numbers don't fall within the first 4 numbers of the sequences (i.e.1-6, 16, 21,etc.) I also need certain sequences where certain numbers appear twice between the 5th and 14th position.

Sorry if it's not clear, but I basically need a random number sequence generator in R which

  • includes exclusion criteria
  • specifies what position certain numbers appear in
  • allows for certain number to appear twice in the sequence after a certain position.

If anyone knows of function that could do this I'd be very grateful.

1
You already have everything you need. Combine c and multiple calls to sample and you're all set. Any function that achieves your desired result will just be a combination of those two functions (and maybe sort and some indexing).Thomas

1 Answers

3
votes

This function does what you want:

specialSample <- function(yourSample, sampleTimes, exclusion, firstFour, appearTwice){
excludedSample <- yourSample[!yourSample%in%exclusion]
first <- sample(excludedSample,1,prob=excludedSample%in%firstFour)
firstposition <- sample(1:4,1)
second <- sample(excludedSample,1,prob=excludedSample%in%appearTwice)
twice <- c(second,second)
sampler <- sample(excludedSample,sampleTimes-length(exclude),replace=TRUE)
positions <- sample(5:14,2)
result <- sampler
result[firstposition] <- first
result[positions] <- twice
return(result)
}

The arguments are

yourSample is the sequence you are sampling form

sampleTimes is how many values you want in your sample (I have specified replace=TRUE if you want replace=FALSE then length(sampleTimes) must be < length(yourSample)

exclusion is the numbers you want excluded

firstFour numbers that you want one of to be in the first four

appearTwice numbers you want to appear twice in certain random positions

 > numbers <- 1:25
 > exclude <- c(2,4,8)
 > firstFour <- 1:4
 > appearTwice <- c(11,12)

 > test <- specialSample(numbers,25,exclude,firstFour,appearTwice)
!> test
  [1] 12 23  3  9 10 10 21 12  7 17 24 15 22 12  3 14  9  9  1  6 19 15

The basic idea is to exploit indexing of vectors vec[positionN]<-value and probability of sampling to get the values you want in the places you want.