2

2つの制約を前提として、2つのベクトルのすべての組み合わせを生成したいと思います。最初のベクトルから3文字を超えることはできず、2番目のベクトルからは常に少なくとも1文字である必要があります。また、組み合わせの最終的な文字数を変えたいと思います。

たとえば、次の2つのベクトルがあります。

vec1=c("A","B","C","D")
vec2=c("W","X","Y","Z")

組み合わせて3人のキャラクターが欲しかったとしましょう。考えられる許容可能な順列は次のとおりです。"A" "B" "X"または"A" "Y" "Z"。許容できない順列は次のようになります。"A" "B" "C"からの文字が少なくとも1つないためvec2

ここで、組み合わせて5文字が必要だったとします。考えられる許容可能な順列は次のとおりです。"A" "C" "Z" "Y"または"A" "Y" "Z" "X"。許容できない順列は次のようになります。"A" "C" "D" "B" "X"から3文字を超える文字があるためvec2

すべての組み合わせを生成してから、何らかの形でサブセットを生成するために使用できると思いますexpand.gridが、もっと簡単な方法があるはずです。前もって感謝します!

4

1 に答える 1

5

これが簡単かどうかはわかりませんが、この戦略では、条件を満たさない順列を除外できます。

  1. vec1許容できるすべての組み合わせを生成します。

  2. vec2許容できるすべての組み合わせを生成します。

  3. 1から1つの解を取り、2から1つの解を取り、すべての組み合わせを生成します。ここでは、後で条件3でフィルタリングを行います。

  4. (組み合わせを探している場合は、それ以外の場合は完了です:)各結果内の文字のすべての順列を生成します。

さあ、

vec1 <- LETTERS [1:4]
vec2 <- LETTERS [23:26]

## lists can eat up lots of memory, so use character vectors instead.
combine <- function (x, y) 
  combn (y, x, paste, collapse = "")

res1 <- unlist (lapply (0:3, combine, vec1))
res2 <- unlist (lapply (1:length (vec2), combine, vec2))

今私たちは持っています:

> res1
 [1] ""    "A"   "B"   "C"   "D"   "AB"  "AC"  "AD"  "BC"  "BD"  "CD"  "ABC"
[13] "ABD" "ACD" "BCD"
> res2
 [1] "W"    "X"    "Y"    "Z"    "WX"   "WY"   "WZ"   "XY"   "XZ"   "YZ"  
[11] "WXY"  "WXZ"  "WYZ"  "XYZ"  "WXYZ"

res3 <- outer (res1, res2, paste0)
res3 <- res3 [nchar (res3) == 5]

だからここにあなたがいます:

> res3
 [1] "ABCWX" "ABDWX" "ACDWX" "BCDWX" "ABCWY" "ABDWY" "ACDWY" "BCDWY" "ABCWZ"
[10] "ABDWZ" "ACDWZ" "BCDWZ" "ABCXY" "ABDXY" "ACDXY" "BCDXY" "ABCXZ" "ABDXZ"
[19] "ACDXZ" "BCDXZ" "ABCYZ" "ABDYZ" "ACDYZ" "BCDYZ" "ABWXY" "ACWXY" "ADWXY"
[28] "BCWXY" "BDWXY" "CDWXY" "ABWXZ" "ACWXZ" "ADWXZ" "BCWXZ" "BDWXZ" "CDWXZ"
[37] "ABWYZ" "ACWYZ" "ADWYZ" "BCWYZ" "BDWYZ" "CDWYZ" "ABXYZ" "ACXYZ" "ADXYZ"
[46] "BCXYZ" "BDXYZ" "CDXYZ" "AWXYZ" "BWXYZ" "CWXYZ" "DWXYZ"

結果を1文字に分割したい場合は、次のようにします。

res <- matrix (unlist (strsplit (res3, "")), nrow = length (res3), byrow = TRUE)
> res
      [,1] [,2] [,3] [,4] [,5]
 [1,] "A"  "B"  "C"  "W"  "X" 
 [2,] "A"  "B"  "D"  "W"  "X" 
 [3,] "A"  "C"  "D"  "W"  "X" 
 [4,] "B"  "C"  "D"  "W"  "X" 

(をちょきちょきと切る)

[51,] "C"  "W"  "X"  "Y"  "Z" 
[52,] "D"  "W"  "X"  "Y"  "Z" 

あなたの組み合わせはどれですか。

于 2012-05-09T17:32:09.400 に答える