前のページ|次のページ

LEXCOMB関数

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

カテゴリ: 組み合わせ
制限事項: LEXCOMB関数は、%SYSFUNCマクロを使用するときには実行できません。

構文

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

必須引数

count

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

k

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

variable

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

要件 LEXCOMB関数を実行する前にこれらの変数を初期化します。
ヒント LEXCOMB関数を実行すると、最初のk個の変数には1つの組み合わせの値が含まれます。

詳細

基本

LEXCOMB関数はループで使用します。LEXCOMBの第1引数は、1から、変数の非欠損値の重複しない組み合わせ数までの各整数値を取ります。このループ内でのLEXCOMBの各実行では、kは同じ値になります。

組み合わせ数

すべての変数に等しくない非欠損値が含まれる場合、組み合わせ数はCOMB(n,k)です。欠損値を含む変数の数がm個ですべての非欠損値が等しくない場合、欠損値は組み合わせから除外されるため、LEXCOMBはCOMB(n-m,k)個の組み合わせを生成します。
一部の変数の値が等しい場合、正確な組み合わせ数を計算するのは難しくなりますが、COMB(n,k)が上限となります。LEXCOMBがゼロ未満の値を返すときにループが終了するのであれば、正確な組み合わせ数を計算する必要はありません。

LEXCOMB処理

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

比較

LEXCOMB関数は、n個の変数から一度にk個を取り出した非欠損値の重複しないすべての組み合わせを辞書式順序で生成します。ALLCOMB関数は、n個の変数値から一度にk個の変数値を取得する場合のすべての組み合わせを、変化量の小さい順に生成します。

例1: 重複しない組み合わせを辞書式順序で生成する

次の例では、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+1;
      rc=lexcomb(j, k, of x[*]);
      put j 5. +3 x1-x3 +3 rc=;
      if rc<0 then leave;
   end;
run;
次の出力がログに書き込まれます。
    1 ant bee cat rc=1 2 ant bee dog rc=3 3 ant bee ewe rc=3 4 ant cat dog rc=2 5 ant cat ewe rc=3 6 ant dog ewe rc=2 7 bee cat dog rc=1 8 bee cat ewe rc=3 9 bee dog ewe rc=2 10 cat dog ewe rc=1 11 cat dog ewe rc=-1

例2: 重複しない組み合わせを辞書式順序で生成する:別の例

LEXCOMB関数の別の使用例を次に示します。
data _null_;
   array x[5] $3 ('X' 'Y' 'Z' 'Z' 'Y');
   n=dim(x);
   k=3;
   ncomb=comb(n, k);
   do j=1 to ncomb+1;
      rc=lexcomb(j, k, of x[*]);
      put j 5. +3 x1-x3 +3 rc=;
      if rc<0 then leave;
   end;
run;
次の出力がログに書き込まれます。
    1 X Y Y rc=1 2 X Y Z rc=3 3 X Z Z rc=2 4 Y Y Z rc=1 5 Y Z Z rc=2 6 Y Z Z rc=-1

関連項目:

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