# r – Non-redundant version of expand.grid

## r – Non-redundant version of expand.grid

How about using `outer`? But this particular function concatenates them into one character string.

``````outer( c(aa, ab, cc), c(aa, ab, cc) , paste )
#     [,1]    [,2]    [,3]
#[1,] aa aa aa ab aa cc
#[2,] ab aa ab ab ab cc
#[3,] cc aa cc ab cc cc
``````

You can also use `combn` on the unique elements of the two vectors if you dont want the repeating elements (e.g. `aa aa`)

``````vals <- c( c(aa, ab, cc), c(aa, ab, cc) )
vals <- unique( vals )
combn( vals , 2 )
#     [,1] [,2] [,3]
#[1,] aa aa ab
#[2,] ab cc cc
``````

In base R, you can use this:

``````expand.grid.unique <- function(x, y, include.equals=FALSE)
{
x <- unique(x)

y <- unique(y)

g <- function(i)
{
z <- setdiff(y, x[seq_len(i-include.equals)])

if(length(z)) cbind(x[i], z, deparse.level=0)
}

do.call(rbind, lapply(seq_along(x), g))
}
``````

Results:

``````> x <- c(aa, ab, cc)
> y <- c(aa, ab, cc)

> expand.grid.unique(x, y)
[,1] [,2]
[1,] aa ab
[2,] aa cc
[3,] ab cc

> expand.grid.unique(x, y, include.equals=TRUE)
[,1] [,2]
[1,] aa aa
[2,] aa ab
[3,] aa cc
[4,] ab ab
[5,] ab cc
[6,] cc cc
``````

#### r – Non-redundant version of expand.grid

If the two vectors are the same, theres the `combinations` function in the `gtools` package:

``````library(gtools)
combinations(n = 3, r = 2, v = c(aa, ab, cc), repeats.allowed = TRUE)

#      [,1] [,2]
# [1,] aa aa
# [2,] aa ab
# [3,] aa cc
# [4,] ab ab
# [5,] ab cc
# [6,] cc cc
``````

And without `aa aa`, etc.

``````combinations(n = 3, r = 2, v = c(aa, ab, cc), repeats.allowed = FALSE)
``````