Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

All possible combinations of two vectors while keeping the order in R

Tags:

r

vector

I have a vector, say vec1, and another vector named vec2 as follows:

vec1 = c(4,1)
# [1] 4 1

vec2 = c(5,3,2)
# [1] 5 3 2

What I'm looking for is all possible combinations of vec1 and vec2 while the order of the vectors' elements is kept. That is, the resultant matrix should be like this:

> res
      [,1] [,2] [,3] [,4] [,5]
 [1,]    4    1    5    3    2
 [2,]    4    5    1    3    2
 [3,]    4    5    3    1    2
 [4,]    4    5    3    2    1
 [5,]    5    4    1    3    2
 [6,]    5    4    3    1    2
 [7,]    5    4    3    2    1
 [8,]    5    3    4    1    2
 [9,]    5    3    4    2    1
[10,]    5    3    2    4    1

# res=structure(c(4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 4, 4, 4, 
# 3, 3, 3, 5, 1, 3, 3, 1, 3, 3, 4, 4, 2, 3, 3, 1, 2, 3, 1, 2, 1, 
# 2, 4, 2, 2, 2, 1, 2, 2, 1, 2, 1, 1), .Dim = c(10L, 5L))

There is no repetition allowed for two vectors. That is, all rows of the resultant matrix have unique elements.

I'm actually looking for the most efficient way. One way to tackle this problem is to generate all possible permutations of length n which grows factorially (n=5 here) and then apply filtering. But it's time-consuming as n grows.

Is there an efficient way to do that?

like image 687
989 Avatar asked May 23 '16 14:05

989


1 Answers

Try this one:

nv1 <- length(vec1)
nv2 <- length(vec2)
n <- nv1 + nv2

result <- combn(n,nv1,function(v) {z=integer(n);z[v]=vec1;z[-v]=vec2;z})

The idea is to produce all combinations of indices at which to put the elements of vec1.

like image 145
Marat Talipov Avatar answered Nov 16 '22 00:11

Marat Talipov