2016-11-16 6 views
0

先週、私は次のようにquestionを掲示しました。アイデアは、変数 "id"に基づいて観測値をランダムに組み合わせてデータベースの内容を決定するループを作ることでした。例えば少なくとも5つのIDが結合されている場合、変数IDに基づいて観測値を結合する

  • データセット1:ID 1、2、3、4、5、6、7、8の組み合わせ...
  • データセット2:ID 1,2の組み合わせ、 3
  • データセット3:ID 2、3、4の組み合わせ、5
  • セット4:ID 5、6、7、8、9、10の組み合わせ...

私は完璧です質問への回答:

for(i in 2:max(o$id)){ 
    combis=combn(unique(o$id),i) 
    for(j in 1:ncol(combis)){ 
    sub=o[o$id %in% combis[,j],] 
    out=sub[1,] # use your function 
    out$label=paste(combis[,j],collapse ='') #provide an id so you know for which combination this result is 
    result=rbind(result,out) # paste it to previous output 
    } 
} 

しかし、今私の質問は次のとおりです。少なくとも5 idsの組み合わせのみを組み合わせたいと指定する方法はありますか?このプロセスは多くの計算時間を要し、小さなデータセット(5つの異なるIDよりも小さいもの)が偏った結果をもたらすことに気付きました。

このlinkを介して、この例を再現するためのデータセットと完全なコードのサンプルが見つかります。私が少なくとも5つのIDの組み合わせにのみ関心があると指定されていない限り、コード全体を実行するにはしばらく時間がかかることに注意してください。

+1

最小限の再現可能な例を提供できますか? http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – C8H10N4O2

+0

私は最近、私の分析のためにこれを "カウント"列を作成し、 5つ未満のIDに基づいていました。 – heyydrien

+0

私は、マッピィステートメント(それをスピードアップするために並列化することもできます)で最適化し、combis [length(combis)> 4]のようなフィルタリングによって組み合わせを制限することができると確信しています。しかし、私は再現可能な例がないので確信が持てません...(以前の投稿のものは動作しません)(AllDataとrainfedとは何ですか?) – Bastien

答えて

1

あなたは5でループを開始することができます。

for(i in 5:max(o$id)){ 
    combis=combn(unique(o$id),i) 
    ... 

この方法は、それぞれの組み合わせで、少なくとも5つの要素があります(combnを参照してください?)。

+0

それは簡単だった..もう一度ありがとう! – user33125

関連する問題