前のページ|次のページ

CALL ALLCOMBルーチン

n個の変数値から一度にk個の変数値を取得する場合のすべての組み合わせを変化量の小さい順に生成します。

カテゴリ: 組み合わせ

構文

CALL ALLCOMB(count, k, variable-1, ..., variable-n);

必須引数

count

整数の変数を指定します。変数には1から組み合わせ数までがループで割り当てられます。

k

各組み合わせの項目数を示す1からn(1とnを含む)までの整数の定数、変数または式を指定します。

variable

すべての数値変数または同じ長さのすべての文字変数を指定します。これらの変数の値は置換されます。

制限事項 33個以内で項目を指定します。33個を超える項目の組み合わせを検出する必要がある場合は、CALL ALLCOMBIルーチンを使用します。
要件 ALLCOMBルーチンを呼び出す前にこれらの変数を初期化します。
ヒント ALLCOMBルーチンを呼び出すと、最初のk個の変数に1つの組み合わせの値が含まれます。

詳細

CALL ALLCOMBの処理

CALL ALLCOMBルーチンをループで使用して、CALL ALLCOMBの第1引数で各整数値(1から組み合わせ数まで)を受け入れます。kは定数です。組み合わせ数は、COMB関数を使用して計算できます。最初の呼び出しで、引数の種類と長さに不整合がないか確認されます。後続の各呼び出しでは、2つの変数の値が交換されます。
ALLPERルーチンを呼び出す場合に第1引数の順序が違っていると、その結果は役に立ちません。特に、変数を初期化した直後に第1引数をjとしてALLCOMBを呼び出すと、j番目の組み合わせは取得されません(jが1である場合を除く)。j番目の組み合わせを取得するには、第1引数に1からjまでの値をそのままの順序で取得して、ALLCOMBをj回呼び出す必要があります。

マクロとCALL ALLCOMBルーチンを使用する

ALLCOMBルーチンは、%SYSCALLマクロを使って呼び出せます。この場合、変数の引数を同一の種類または長さとする必要はありません。SYSCALLで引数が数値であることが識別されると、%SYSCALLは戻り値の形式を調整します。
CALL ALLCOMBルーチンの実行中にエラーが発生すると、次の両方の値が設定されます。
  • &SYSERRには4よりも大きい値が割り当てられます。
  • &SYSINFOには-100よりも小さい値が割り当てられます。
エラーがない場合、&SYSERRはゼロに設定されて、&SYSINFOは次のいずれかの値に設定されます。
  • 0 (count=1の場合)
  • j(variable-jおよびvariable-kの値が交換されていて、j<kの場合)
  • –1(重複しないすべての組み合わせが生成済みのために値が交換されなかった場合)

比較

SASには、組み合わせを生成する4つの関数またはCALLルーチンがあります。
  • n個の変数の(欠損値または非欠損値)の考えられるすべての組み合わせを生成します。値は数値または文字値になります。各組み合わせは、前の組み合わせに基づいて形成されます(1つの値を削除して別の値を挿入)。
  • LEXCOMB:複数の変数の非欠損値重複しないすべての組み合わせを生成します。値は数値または文字値になります。組み合わせは、辞書式順序で生成されます。
  • ALLCOMBIは、n個の項目のindicesのすべての組み合わせを生成します。indicesは、1からnまでの整数です。各組み合わせは、前の組み合わせに基づいて形成されます(1つのインデックスを削除して別のインデックスを挿入)。
  • LEXCOMBIは、n個の項目のindicesのすべての組み合わせを生成します。indicesは、1からnまでの整数です。組み合わせは、辞書式順序で生成されます。
ALLCOMBIは最も速い関数およびCALLルーチンです。最も遅いのはLEXCOMBです。

例1: DATAステップでCALL ALLCOMBを使用する

CALL ALLCOMBルーチンをDATAステップで使用している例を次に示します。
data _null_;
   array x[5] $3 ('ant' 'bee' 'cat' 'dog' 'ewe');
   n=dim(x);
   k=3;
   ncomb=comb(n, k);
   do j=1 to ncomb+1;
      call allcomb(j, k, of x[*]);
      put j 5. +3 x1-x3;
   end;
run;
次の出力がログに書き込まれます。
    1 ant bee cat 2 ant bee ewe 3 ant bee dog 4 ant cat dog 5 ant cat ewe 6 ant dog ewe 7 bee dog ewe 8 bee dog cat 9 bee ewe cat 10 dog ewe cat 11 dog ewe cat

例2: マクロとCALL ALLCOMBを使用し、リターンコードを表示する

CALL ALLCOMBルーチンをマクロで使用している例を次に示します。出力には%SYSINFOマクロ用の値が含まれます。
%macro test;
   %let x1=ant;
   %let x2=-.1234;
   %let x3=1e10;
   %let x4=hippopotamus;
   %let x5=zebra;
   %let k=2;
   %let ncomb=%sysfunc(comb(5, &k));
   %do j=1 %to &ncomb+1;
      %syscall allcomb(j, k, x1, x2, x3, x4, x5);
      %let jfmt=%qsysfunc(putn(&j, 5.));
      %let pad=%qsysfunc(repeat(%str(),30-%length(&x1 &x2)));
      %put &jfmt:  &x1 &x2 &pad sysinfo=&sysinfo;
   %end;
%mend;
     
%test
     
次の出力がログに書き込まれます。
   1:  ant -0.1234 sysinfo=0 2:  ant zebra sysinfo=2 3:  ant hippopotamus sysinfo=2 4:  ant 10000000000 sysinfo=2 5:  -0.1234 10000000000 sysinfo=1 6:  -0.1234 zebra sysinfo=2 7:  -0.1234 hippopotamus sysinfo=2 8:  10000000000 hippopotamus sysinfo=1 9:  10000000000 zebra sysinfo=2 10:  hippopotamus zebra sysinfo=1 11:  hippopotamus zebra sysinfo=-1

関連項目:

関数:
前のページ|次のページ|ページの先頭へ