前のページ|次のページ

CALL LEXCOMBルーチン

n個の変数を同時にk個使用するときの、重複しない非欠損値のすべての組み合わせを辞書式順序で生成します。

カテゴリ: 組み合わせ
操作: %SYSCALLマクロステートメントで呼び出されると、CALL LEXCOMBの引数から引用符が削除されます。詳細については、 CALLルーチンと%SYSCALLマクロステートメントを使用する を参照してください。

構文

CALL LEXCOMB(count, k, variable-1, …, variable-n);

必須引数

count

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

k

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

variable

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

要件 LEXCOMBルーチンを呼び出す前にこれらの変数を初期化します。
ヒント LEXCOMBルーチンを呼び出すと、最初のk個の変数に1つの組み合わせの値が含まれます。

詳細

基本

CALL LEXCOMBルーチンはループで使用します。CALL LEXCOMBの第1引数は1から変数の非欠損値の重複しない組み合わせ数までの各整数値を受け付けます。このループからLEXCOMBを呼び出すときは、kは毎回同じ値です。

組み合わせ数

すべての変数に等しくない非欠損値が含まれる場合、組み合わせ数はCOMB(n,k)です。欠損値を含む変数の数がm個ですべての非欠損値が等しくない場合、欠損値は組み合わせから除外されるため、LEXCOMBはCOMB(n-m,k)個の組み合わせを生成します。
一部の変数に等しい値が含まれる場合、正確な組み合わせ数を計算することは困難です。正確な組み合わせ数を計算できない場合は、CALL LEXCOMBルーチンのかわりにLEXCOMB関数を使用します。

CALL LEXCOMBの処理

LEXCOMBルーチンを初めて呼び出すと、次のアクションが実行されます。
  • 引数の種類と長さに不整合がないか確認が行われます。
  • m個の欠損値が最後のm個の引数に割り当てられます。
  • n-mの非欠損値がcountに続く最初のn-m引数に昇順で割り当てられます。
後続の呼び出しでは、最後の組み合わせまで(最後の組み合わせを含む)、非欠損値の重複しない次の組み合わせが辞書式順序で生成されます。
LEXCOMBルーチンを呼び出す場合に第1引数の順序が違っていると、その結果は役に立ちません。特に、変数を初期化した直後に第1引数を jとしてLEXCOMBを呼び出すと、j番目の組み合わせは取得されません(jが1である場合を除く)。j番目の組み合わせを取得するには、第1引数で1からjまでの値をそのままの順序で取得して、LEXCOMBルーチンを j回呼び出す必要があります。

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

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

比較

CALL LEXCOMBルーチンは、n個の変数を同時にk個使用するときの、重複しない非欠損値のすべての組み合わせを辞書式順序で生成します。CALL ALLCOMBルーチンは、n個の変数を同時にk個使用するときのすべての値の組み合わせを、変化量の小さい順に生成します。

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

LEXCOMBルーチンを呼び出して辞書式順序で重複しない組み合わせを生成する例を次に示します。
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;
      call lexcomb(j, k, of x[*]);
      put j 5. +3 x1-x3;
   end;
run;
次の出力がログに書き込まれます。
    1 ant bee cat 2 ant bee dog 3 ant bee ewe 4 ant cat dog 5 ant cat ewe 6 ant dog ewe 7 bee cat dog 8 bee cat ewe 9 bee dog ewe 10 cat dog ewe

例2: マクロとCALL LEXCOMBを使用する

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

関連項目:

関数:
CALLルーチン:
前のページ|次のページ|ページの先頭へ