2016-06-16 4 views
-1

異なるサイズの2つのベクトルをすべて異なる順列で結合する必要があります。例えば:すべての順列で2つの異なるベクトルを混合する

a <- c(A,B,C) 
b <- c(1,2,3,4,5,6) 

と私はそのような二つのベクトルにそれらを「ミックス」する必要があります。

m <- c(1,2,C) 
n <- c(A,B,3,4,5,6) 

とノー繰り返しで、これらの組み合わせの多くを必要としています。 (すべての値の型が同じになります)

+2

正確な規則はありません明らかです。たとえば、2つの要素スイッチまたは0〜3つのスイッチを常に実行する必要がありますか? – Roland

+0

はベクトルの長さが可変ですか? 3と6で固定? –

+0

「すべての異なる順列」というフレーズが意味するものは明確ではありません。明確にしていただけますか?あなたの例では、2^3 = 8ペアのベクトル、あるいはもっと大きなセットが必要ですか?あなたは "順列"という言葉を使用しますが、あなたの例では要素の置換はありません。単にインデックスを保存するスワップだけです。 –

答えて

0

単一順列を取得する: を順序が問題と想定していない場合は、mは長さ3を持っています

> m <- sample(union(a,b),3,replace=FALSE) 
> n <- setdiff(union(a,b),m) 
> m 
[1] "1" "6" "2" 
> n 
[1] "A" "B" "C" "3" "4" "5" 

あなたもメートルをランダム化することができます順序が問題を行い、自然な順序を仮定することである場合、ベクトルの長さは

> m <- sample (union(a,b),sample(1:length(union(a,b)),1),replace=FALSE) 
> n <- setdiff(union(a,b),m) 
> m 
[1] "1" "C" "B" 
> n 
[1] "A" "2" "3" "4" "5" "6" 

を得るために、{1,2,3,4,5,6、A、B、C}

> n <- sort(setdiff(union(a,b),m)) 
> m <- sort(sample (union(a,b),3,replace=FALSE)) 
> n <- sort(setdiff(union(a,b),m)) 
> m 
[1] "3" "B" "C" 
> n 
[1] "1" "2" "4" "5" "6" "A" 
01あなたは、ベクトルの長さを決定する必要がありますすべての可能な順列のための

それは私には見えます

0

(長さ(メートル)= 1は、9つの長さ(mについて順列、)= 2があるとき36などがあります)結合されたベクトルを並べ替えるようにします。これを行うには、まず、順列を生成する関数が必要です。ここでは、ベースRにおける再帰的な実装です:

permr <- function(v,r=length(v)) if (r==0L) NULL else do.call(rbind,lapply(seq_along(v),function(i) cbind(v[i],permr(v[-i],r-1L)))); 

はデモ:あなたがしたい場合は

a <- c('A','B','C'); 
b <- 1:6; 
permr(c(a,b),3L); ## r=3 
##  [,1] [,2] [,3] 
## [1,] "A" "B" "C" 
## [2,] "A" "B" "1" 
## [3,] "A" "B" "2" 
## [4,] "A" "B" "3" 
## [5,] "A" "B" "4" 
## 
## ... snip ... 
## 
## [500,] "6" "5" "C" 
## [501,] "6" "5" "1" 
## [502,] "6" "5" "2" 
## [503,] "6" "5" "3" 
## [504,] "6" "5" "4" 

permr(1:3); ## defaults to full-size subset, i.e. r=n=3 
##  [,1] [,2] [,3] 
## [1,] 1 2 3 
## [2,] 1 3 2 
## [3,] 2 1 3 
## [4,] 2 3 1 
## [5,] 3 1 2 
## [6,] 3 2 1 
permr(1:4,3L); ## permute r=3 of n=4 
##  [,1] [,2] [,3] 
## [1,] 1 2 3 
## [2,] 1 2 4 
## [3,] 1 3 2 
## [4,] 1 3 4 
## [5,] 1 4 2 
## [6,] 1 4 3 
## [7,] 2 1 3 
## [8,] 2 1 4 
## [9,] 2 3 1 
## [10,] 2 3 4 
## [11,] 2 4 1 
## [12,] 2 4 3 
## [13,] 3 1 2 
## [14,] 3 1 4 
## [15,] 3 2 1 
## [16,] 3 2 4 
## [17,] 3 4 1 
## [18,] 3 4 2 
## [19,] 4 1 2 
## [20,] 4 1 3 
## [21,] 4 2 1 
## [22,] 4 2 3 
## [23,] 4 3 1 
## [24,] 4 3 2 

今、私たちはどのrための合成ベクトルの置換行列を生成することができますすべてのサブセットサイズを得るには、を使用して、lisの置換行列を集めることができますt。今、私たちは、計算の労力の面でそこまで取得しているものの:

v <- c(a,b); system.time({ res <- lapply(seq_along(v),function(r) permr(v,r)); }); 
## user system elapsed 
## 11.813 0.000 11.824 
sapply(res,nrow); 
## [1]  9  72 504 3024 15120 60480 181440 362880 362880 
lapply(res,head); 
## [[1]] 
##  [,1] 
## [1,] "A" 
## [2,] "B" 
## [3,] "C" 
## [4,] "1" 
## [5,] "2" 
## [6,] "3" 
## 
## [[2]] 
##  [,1] [,2] 
## [1,] "A" "B" 
## [2,] "A" "C" 
## [3,] "A" "1" 
## [4,] "A" "2" 
## [5,] "A" "3" 
## [6,] "A" "4" 
## 
## [[3]] 
##  [,1] [,2] [,3] 
## [1,] "A" "B" "C" 
## [2,] "A" "B" "1" 
## [3,] "A" "B" "2" 
## [4,] "A" "B" "3" 
## [5,] "A" "B" "4" 
## [6,] "A" "B" "5" 
## 
## [[4]] 
##  [,1] [,2] [,3] [,4] 
## [1,] "A" "B" "C" "1" 
## [2,] "A" "B" "C" "2" 
## [3,] "A" "B" "C" "3" 
## [4,] "A" "B" "C" "4" 
## [5,] "A" "B" "C" "5" 
## [6,] "A" "B" "C" "6" 
## 
## [[5]] 
##  [,1] [,2] [,3] [,4] [,5] 
## [1,] "A" "B" "C" "1" "2" 
## [2,] "A" "B" "C" "1" "3" 
## [3,] "A" "B" "C" "1" "4" 
## [4,] "A" "B" "C" "1" "5" 
## [5,] "A" "B" "C" "1" "6" 
## [6,] "A" "B" "C" "2" "1" 
## 
## [[6]] 
##  [,1] [,2] [,3] [,4] [,5] [,6] 
## [1,] "A" "B" "C" "1" "2" "3" 
## [2,] "A" "B" "C" "1" "2" "4" 
## [3,] "A" "B" "C" "1" "2" "5" 
## [4,] "A" "B" "C" "1" "2" "6" 
## [5,] "A" "B" "C" "1" "3" "2" 
## [6,] "A" "B" "C" "1" "3" "4" 
## 
## [[7]] 
##  [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
## [1,] "A" "B" "C" "1" "2" "3" "4" 
## [2,] "A" "B" "C" "1" "2" "3" "5" 
## [3,] "A" "B" "C" "1" "2" "3" "6" 
## [4,] "A" "B" "C" "1" "2" "4" "3" 
## [5,] "A" "B" "C" "1" "2" "4" "5" 
## [6,] "A" "B" "C" "1" "2" "4" "6" 
## 
## [[8]] 
##  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
## [1,] "A" "B" "C" "1" "2" "3" "4" "5" 
## [2,] "A" "B" "C" "1" "2" "3" "4" "6" 
## [3,] "A" "B" "C" "1" "2" "3" "5" "4" 
## [4,] "A" "B" "C" "1" "2" "3" "5" "6" 
## [5,] "A" "B" "C" "1" "2" "3" "6" "4" 
## [6,] "A" "B" "C" "1" "2" "3" "6" "5" 
## 
## [[9]] 
##  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
## [1,] "A" "B" "C" "1" "2" "3" "4" "5" "6" 
## [2,] "A" "B" "C" "1" "2" "3" "4" "6" "5" 
## [3,] "A" "B" "C" "1" "2" "3" "5" "4" "6" 
## [4,] "A" "B" "C" "1" "2" "3" "5" "6" "4" 
## [5,] "A" "B" "C" "1" "2" "3" "6" "4" "5" 
## [6,] "A" "B" "C" "1" "2" "3" "6" "5" "4" 
## 

あなたが興味を持っている場合は、次のように、私たちはあなたの例の順列を見つけることができます組み合わせの

which(apply(res[[3L]],1L,function(v) all(v==c(1,2,'C')))); 
## [1] 192 
res[[3L]][192L,]; 
## [1] "1" "2" "C" 
which(apply(res[[6L]],1L,function(v) all(v==c('A','B',3:6)))); 
## [1] 436 
res[[6L]][436L,]; 
## [1] "A" "B" "3" "4" "5" "6" 
関連する問題