2016-05-23 11 views
8

順序を維持しながら、私は、ベクトルを持っているvec1を言うと、次のようにvec2という名前の別のベクトル:2つのベクトルのすべての可能な組み合わせR

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

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

私が探している何がvec1のすべての可能な組み合わせでありますvec2であり、ベクトルの要素の順序は維持される。つまり、結果の行列は次のようになります。

> 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)) 

2つのベクトルの繰り返しは許されません。つまり、結果の行列のすべての行に固有の要素があります。

私は実際に最も効率的な方法を探しています。この問題に取り組む1つの方法は、因子的に成長する長さnのすべての可能な順列(ここではn=5)を生成してからフィルタリングを適用することです。しかし、nが大きくなると時間がかかります。

それを行うための効率的な方法はありますか?

+0

だから、それはあなたが順列をしたくない明らかだが、あなたが「注文を保つ」ことにより、正確に何を意味するのですか? 'vec2'のすべての要素は元のインデックス順でなければなりませんが(vec1'でも同じですが)、ある入力の要素が他の要素の前にあるかどうかに制限はありません。次に、両方のベクトルに共通の値がある場合はどうなりますか?それとも、起こらないことが保証されていますか? –

答えて

13

はこのお試しください:

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}) 

アイデアはVEC1の要素を入れての指標のすべての組み合わせを生成することです。

+0

ありがとう!非常に良いアイデア。ちょっとした編集。 't(result)'が返されます。 – 989

2

ないマラトTalipovソリューションとしてその優雅な、しかし、あなたが行うことができます。

# get the ordering per vector 
cc <- c(order(vec1,decreasing = T), order(vec2, decreasing = T)+length(vec1)) 
cc 
[1] 1 2 3 4 5 

# permutation to get all "order-combinations" 
library(combinat) 
m <- do.call(rbind, permn(cc)) 

# remove unsorted per vector, only if both vectors are correct set TRUE for both: 
gr <- apply(m, 1, function(x){ 
      !is.unsorted(x[x < (length(vec1)+1)]) & !is.unsorted(x[x > (length(vec1))]) 
     }) 

# result, exchange the order index with the vector elements: 
t(apply(m[gr, ], 1, function(x, y) y[x], c(vec1, vec2))) 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 4 1 5 3 2 
[2,] 4 5 3 1 2 
[3,] 4 5 3 2 1 
[4,] 4 5 1 3 2 
[5,] 5 4 1 3 2 
[6,] 5 4 3 2 1 
[7,] 5 4 3 1 2 
[8,] 5 3 4 1 2 
[9,] 5 3 4 2 1 
[10,] 5 3 2 4 1 
関連する問題