n個の変数からm個の変数を選択する、組み合わせのデータセットを作成する方法

「い」「ろ」「は」「に」という4つの値から2つを選ぶ場合、組合せの数は
4C2で6通りになりますが、その組み合わせを1組み1オブザベーションとしてデータセットを作る場合、たとえば以下のようにかけます。

data A1;
   array X(4) $ ('い' 'ろ' 'は' 'に');
   do i=1 to comb(dim(X),2);
      call allcomb(i, 2, of X(*));
 keep X1 X2;
      output;
   end;
run;











まずcomb関数は組合せ数を返します、dim(X)つまり4から2をとる組合せ数、つまりここが
6になります。

作成したいデータセットは6オブザベーションになるはずのなので1から6までのループをかけ

allcombルーチンをかけます、ここでの第1引数は作成された各組合せに振られた連番で
1から6すべて選択してoutputすることで全組み合わせをデータに起こせます。
2つの変数しか必要ないので第3,4要素の変数をdropします。


また例えば、全順列が欲しい場合は階乗をかえすfact関数と
allpermルーチンで、以下のようにできます。

data A2;
   array X(4) $ ('い' 'ろ' 'は' 'に');
   do i=1 to fact(dim(X));
      call allperm(i, of X(*));
 drop i;
      output;
   end;
run;






















ちなみに1000個の変数をallpermルーチンに指定したら、天文学な数字になって
永遠に処理終わらなくなんのかなと思って、よし、SASよ永久無限に働くがよい!と思って
ためしにやってみると









「ERROR: ALLPERMルーチンは20個を超える変数を並べ替えることはできませんが、
       1000個の変数が指定されました。
 ERROR: 内部エラーが関数ALLCOMBに検出されました。DATAステップは、
       EXECUTIONフェーズで終了しました。」

とSASにしっかり咎めていただきました。



0 件のコメント:

コメントを投稿