Michele - 1 year ago 117
R Question

# Non-redundant version of expand.grid

The

`R`
function
`expand.grid`
returns all possible combination between the elements of supplied parameters. e.g.

``````> expand.grid(c("aa", "ab", "cc"), c("aa", "ab", "cc"))
Var1 Var2
1   aa   aa
2   ab   aa
3   cc   aa
4   aa   ab
5   ab   ab
6   cc   ab
7   aa   cc
8   ab   cc
9   cc   cc
``````

Do you know an efficient way to get directly (so without any row comparison after
`expand.grid`
) only the 'unique' combinations between the supplied vectors? The output will be

``````  Var1 Var2
1   aa   aa
2   ab   aa
3   cc   aa
5   ab   ab
6   cc   ab
9   cc   cc
``````

EDIT the combination of each element with itself could be eventually discarded from the answer. I don't actually need it in my program even though (mathematically)
`aa aa`
would be one (regular) unique combination between one element of
`Var1`
and another of
`var2`

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 don't 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"
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download