Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R - sample() within for loop generates identical permutations?

Tags:

r

permutation

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.

like image 786
Darren J. Fitzpatrick Avatar asked Aug 02 '26 15:08

Darren J. Fitzpatrick


1 Answers

For a reproducible example, just replace options[1] with a constant set and labels to 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 your for loop, you shuffle all but the first column of a data.frame. This works as you expect. Put print(names(perm)) in after finishing making perm and you will see. You then rbind this 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.

like image 69
Brian Diggs Avatar answered Aug 05 '26 08:08

Brian Diggs