When I run a simple for loop to compute X number of permutations of a vector, the sample() function returns the same permutation for each iteration.
Below is my code:
options <- commandArgs(trailingOnly=T)
labels <- read.table(options[2], header=F)
holder <- c()
for (i in 1:options[1]){
perm <- sample(labels[,2:ncol(labels)], replace=F)
perm <- cbind(as.character(labels[1]), perm)
holder <- rbind(holder, perm)
}
write.table(holder, file=options[3], row.names=F, col.names=F, quote=F, sep='\t')
Is there a reason why this is so? Is there another simple way to generate say 1000 permutations of a vector?
*Added after comment – a replicable example*
vec <- 1:10
holder <-c()
for (i in 1:5){
perm <- sample(vec, replace=F)
holder <- rbind(holder, perm)
}
> holder
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
perm 3 2 1 10 9 6 7 4 5 8
perm 5 8 2 3 4 10 9 1 6 7
perm 10 7 3 1 4 2 5 8 9 6
perm 9 5 2 8 3 1 6 10 7 4
perm 3 7 5 6 8 2 1 9 10 4
And this works fine! I guess I have a bug somewhere! My input is perhaps in a mess.
Thanks,
D.
Thanks,
D.
For a reproducible example, just replace
options[1]with a constant set andlabelsto a built-in or self-specified data frame. (By the way, neither are great variable names being base functions.) Just looking at the inner part of yourforloop, you shuffle all but the first column of a data.frame. This works as you expect. Putprint(names(perm))in after finishing makingpermand you will see. You thenrbindthis data frame to the previous results.rbind, recognizing it is working with data frames, helpfully reshuffles the column order of the different data frames so that the column names line up (which, generally, is what you would want it to do; the name of the column defines which one it is and you would want to extend each column appropriately.)The problem is that you are doing permutations on columns of a data frame, not “of a vector” as you seem to think.