Search code examples
rpermutationpermute

How to calculate permutations of group labels with R?


Given a vector like:

labels <- c(1,2,3,3,3)

How to get all possible group relabelings? For this example:

1,2,3,3,3
1,3,2,2,2
2,1,3,3,3
2,3,1,1,1
3,1,2,2,2
3,2,1,1,1

I have been looking at the permute package but I don't see how to apply it to this case.


Solution

  • How about this solution

    labels <- c(1,2,3,3,3)
    library(data.table)
    a <- do.call(cbind, combinat::permn(unique(labels)))
    data.table(a)[,lapply(.SD, function(x)x[labels]),]
    #   V1 V2 V3 V4 V5 V6
    #1:  1  1  3  3  2  2
    #2:  2  3  1  2  3  1
    #3:  3  2  2  1  1  3
    #4:  3  2  2  1  1  3
    #5:  3  2  2  1  1  3
    

    Or, just

    apply(a, 2, function(x) x[labels])
    #     [,1] [,2] [,3] [,4] [,5] [,6]
    #[1,]    1    1    3    3    2    2
    #[2,]    2    3    1    2    3    1
    #[3,]    3    2    2    1    1    3
    #[4,]    3    2    2    1    1    3
    #[5,]    3    2    2    1    1    3