2016-07-20 16 views
4

私は、2つの異なる値を含むベクトルのすべての可能な順列を作成したいと考えています。R-値の固有の順列を見つける

私は長さ3のベクトルを持っていると私は、単一の1を含むすべての可能な組み合わせをしたい場合たとえば、私の所望の出力はこのように見ているリストである:これとは対照的に

list.1 <- list(c(1,0,0), c(0,1,0), c(0,0,1)) 

、私はすべてしたい場合3 1Sを含む可能性のある組み合わせ、私の所望の出力はこのように見ているリストです。別の言い方をする

list.3 <- list(c(1,1,1)) 

10値のパターンは重要ではなく、すべての1 sがtreateする必要がありますdは他のすべてと同一である。

ここで、他の場所検索に基づいて、私はいくつかのアプローチを試みた:有望と思われるcombinatパッケージから機能permnを使用して、だから、

expand.grid(0:1, 0:1, 0:1) # this includes all possible combinations of 1, 2, or 3 ones 
permn(c(0,1,1))    # this does not treat the ones as identical (e.g. it produces (0,1,1) twice) 
unique(permn(c(0,1,1)))  # this does the job! 

を。私は私の実際の問題(50%の1と50%の0で長さ20のベクトル、これをスケールアップどこしかし、私は問題に実行:

unique(permn(c(rep(1,10), rep(0, 10)))) 

# returns the error: 
Error in vector("list", gamma(n + 1)) : 
    vector size specified is too large 

私の理解では、この中で、理由は何が起こっているということですpermnに呼び出して、それはそれらの多くは同じであっても、すべての可能な順列を含むリストを作成し、このリストはRが処理するには大きすぎる。

誰もこれを回避する方法のための提案を持っていますか?

申し訳ありませんがこれまでに答えられている - 類似した言語を含むが、異なるpの質問がたくさんあります私のニーズを満たすソリューションを見つけることができませんでした!

+2

[この](http://stackoverflow.com/a/28368933/3184024)これは、所望の出力を生成しません – wici

答えて

1

expand.gridにはすべての順列が含まれています。直後のサブセットを追加します。

combinations <- function(size, choose) { 

    d <- do.call("expand.grid", rep(list(0:1), size)) 
    d[rowSums(d) == choose,] 

} 

combinations(size=10, choose=3) 
# Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10 
# 8  1 1 1 0 0 0 0 0 0  0 
# 12 1 1 0 1 0 0 0 0 0  0 
# 14 1 0 1 1 0 0 0 0 0  0 
# 15 0 1 1 1 0 0 0 0 0  0 
# 20 1 1 0 0 1 0 0 0 0  0 
# 22 1 0 1 0 1 0 0 0 0  0 
... 
1

問題は、実際には、すべての階乗(20)(〜10^18)の順列を計算していて、あなたの記憶に収まらないという問題です。 あなたが探しているのは、マルチセット順列を効率的に計算する方法です。 multicoolパッケージには、これを行うことができます:

library(multicool) 

res <- allPerm(initMC(c(rep(0,10),rep(1,10)))) 

この計算は私のラップトップ上で約2分かかりますが、間違いなく実現可能です。

+0

を助けるべきです。あなたは 'head(res)'を投稿できますか? –

+0

この解決策は私にとってはうまくいくと思われました。 rowsums == 10で184,756通りの組み合わせが生成されました。しかし私はピエールのソリューションを1秒未満で実行するように選択しました(私のコンピュータでは約90秒でした)。 –

関連する問題