# 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(1:10)
pairup(99)
pairup(letters)
pairup(letters, ncol=3)
pairup(letters, ncol=3, unmatched.self=F)
Nice! A 'sample'-based approach I pasted to gist:
ReplyDeletehttps://gist.github.com/anonymous/5504611
Looks good! Actually I think your command works better than mine :)
Deletepairup(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.
Francis