Wednesday, May 1, 2013

A Command for Randomly Creating Sets of Elements from a Vector

# This command pairs (of arbitrary length) together a list of items randomly.
# I think it is useful for simulations matching individuals together.

pairup = function(x, ncol=2, unmatched.self=T) {

  # Calculate the length of the x vector.
  xleng = length(x)

  # This checks if the input vector is a scalar.
  # If it is then it assumes that the number of that scalar is to be the last number is the seqence 1:x
  if (xleng==1) x = 1:(xleng=x)
  # This command is pretty weird.  I combined two commands to make a single line command.
  # It sets the xleng equal to x and x equal to the sequence 1:x

  # Calculate the length of each column that will be created.
  hleng = floor(xleng/ncol)

  # Randomize x
  x = x[order(runif(xleng))]

  pair = x[1:hleng]
  for (i in 2:ncol) pair = cbind(pair,x[((i-1)*hleng+1):((i)*hleng)])

  # If there is a odd number of xs then this will match the remaining unmatched x with itself if unmatched.self is T.
  if ((unmatched.self)&(floor(xleng/ncol)!=xleng/ncol)) pair=rbind(pair, c(x[ncol*hleng+1]))
  if ((!unmatched.self)&(floor(xleng/ncol)!=xleng/ncol)) print(x[!(x %in% pair)])

  return (pair)

pairup(letters, ncol=3)
pairup(letters, ncol=3, unmatched.self=F)


  1. Nice! A 'sample'-based approach I pasted to gist:

    1. Looks good! Actually I think your command works better than mine :)

      pairup(1:11, ncol=3)
      pairup2(1:11, ncol=3)

      My command drops one of the values which should be paired with itself. Thanks for posting this code. I really appreciate it.