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)

Leave a Reply

Your email address will not be published. Required fields are marked *