# [R] Multiset Permutations

G. Jay Kerns gkerns at ysu.edu
Mon Apr 7 01:27:39 CEST 2008

```Dear Steven,

The prob package does this, too.  (Please see the * fix below).

x <- c(0, 0, 1, 2, 2)
library(prob)
A <- permsn(x, 5)                      # with repeated columns
B <- unique( data.frame( t(A) ))   # no repeated rows

The data frame B will have 56 rows and 5 columns.  If you need the
columns collapsed, then you can use the

apply(B, 1, paste, sep = "", collapse = "")

command that Johannes suggested.  Details are in the prob package vignette,

vignette("prob")

I hope that this helps,
Jay

* fix:  As it happens, your particular question helped to identify a
bug in the current CRAN version of prob.  Thank you!  :-)   Below is a
fix until the updated version appears.

permsn <- function (x, m)
{
require(combinat)
if (is.numeric(x) && length(x) == 1 && x > 0 && trunc(x) == x)
x <- seq(x)
temp <- combn(x, m)
if ( isTRUE(all.equal(m,1)) ) {
P <- temp
} else if (isTRUE(all.equal(m, length(x)))) {
temp <- matrix(x, ncol = 1)
P <- array(unlist(permn(temp[, 1])), dim = c(m, factorial(m)))
} else {
k <- dim(temp)
n <- dim(temp)
P <- array(unlist(permn(temp[, 1])), dim = c(k, factorial(k)))
for (i in 2:n) {
a <- temp[, i]
perms <- array(unlist(permn(a)), dim = c(k, factorial(k)))
P <- cbind(P, perms)
}
}
return(P)
}

***************************************************
G. Jay Kerns, Ph.D.
Assistant Professor / Statistics Coordinator
Department of Mathematics & Statistics
Youngstown State University
Youngstown, OH 44555-0002 USA
Office: 1035 Cushwa Hall
Phone: (330) 941-3310 Office (voice mail)
-3302 Department
-3170 FAX
E-mail: gkerns at ysu.edu
http://www.cc.ysu.edu/~gjkerns/

```