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)