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 件のコメント:
コメントを投稿