前のページ|次のページ

DOステートメント、反復

インデックス変数の値に基づいて、DOステートメントとENDステートメントにはさまれている各ステートメントを実行します。

該当要素: DATAステップ
カテゴリ: 制御
種類: 実行

構文

DO index-variable=specification-1<, ...specification-n> ;
...more SAS statements...
END;

引数

index-variable

DOグループの実行を制御する値を持つ変数を指定します。

ヒント インデックス変数の削除を指定しない場合、作成されるデータセットにインデックス変数が含まれます。
注意:
DOグループ内でインデックス変数を変更しないでください。
反復DOグループ内でインデックス変数を変更すると、無限ループが発生する場合があります。

specification

1つの式または複数の式を次の形式で指定します。

start <TO stop> <BY increment> <WHILE(expression) | UNTIL(expression)>
初回実行時、DOグループは、index-variablestartに等しいとして実行されます。startの値は、ループの初回実行前に評価されます。

start

インデックス変数の初期値を指定します。

TO stopまたはBY incrementを指定せずに使用する場合、startの値は次の形式で指定されます。
item-1 <, ...item-n>;
itemには、数値定数または文字定数を指定します。変数を指定する場合もあります。文字定数は一重引用符で囲みます。リストに指定したそれぞれの値に対してDOグループが1度実行されます。WHILE条件を追加する場合、この条件はそのすぐ前にあるitemにのみ適用されます。
要件 TO stopまたはBY incrementを使用する場合、startには数値または数値を生成する式を指定する必要があります。
さまざまな形式の反復DOステートメントを使用する

TO stop

インデックス変数の終了値を指定します。

startstopの両方を指定する場合、index-variableの値がstopになるまで、incrementの値に基づいてステートメントが実行されます。startincrementのみを指定する場合、ステートメントによってループの中止が指示されるか、またはDOステートメントで指定されたWHILE式またはUNTIL式を満たすまで、incrementの値に基づいてステートメントが実行されます。stopincrementも指定されない場合、このグループはstartの値に基づいて実行されます。stopの値は、ループの初回実行前に評価されます。
要件 stopの値は、数値または数値を生成する式を指定する必要があります。
ヒント DOグループでのstopの変更は、繰り返し回数に影響を与えることはありません。処理が終了する前にループの繰り返しを中止するには、index-variableの値を変更してstopの値を上回るようにするか、LEAVEステートメントを使用してステートメントのループを中止します。
さまざまな形式の反復DOステートメントを使用する

BY increment

index-variableの増分値を制御する正または負の数値(または数値を生成する式)を指定します。

incrementの値はループを実行する前に評価されます。DOグループでのincrementの変更は、繰り返し回数に影響を与えることはありません。incrementを指定しない場合、インデックス変数は1つずつ増加します。incrementが正の数値の場合、startの値を下限値にする必要があります。また、stopが存在する場合、この値はループの上限値にする必要があります。incrementが負の数値の場合、startの値は上限値にする必要があります。また、stopが存在する場合、この値はループの下限値にする必要があります。
さまざまな形式の反復DOステートメントを使用する

WHILE(expression) | UNTIL(expression)

DOグループの実行前または実行後に指定したSAS式を評価します。式は丸かっこで囲みます。

WHILE式はループの実行前に評価されるので、この式が真の間、グループ内のステートメントが繰り返し実行されます。UNTIL式はループ実行後に評価されるので、この式が真になるまで、グループ内のステートメントが繰り返し実行されます。
制限事項 WHILEまたはUNTILの指定は、WHILEまたはUNTILが指定されている句の最後の項目にのみ影響を与えます。
参照項目 DO WHILEステートメント およびDO UNTILステートメント
さまざまな形式の反復DOステートメントを使用する
要件 反復DOステートメントには、少なくとも1つのspecification引数が必要です。
ヒント オプションであるTO句とBY句の位置は逆にすることができます。
複数のspecificationを使用する場合、それぞれのspecificationが実行前に評価されます。

比較

DOステートメントは、他に3種類あります。
  • DOステートメントは、DOグループの処理を指定するもっとも簡単な形式です。通常、IF-THEN/ELSEステートメントの中で使用され、1単位として実行するステートメントのグループを指定します。
  • DO UNTILステートメントは、DOループを繰り返した後に条件を毎回確認して、条件が真になるまでDOループ内のステートメントを実行します。
  • DO WHILEステートメントは、DOループを繰り返す前に条件を毎回確認して、条件が真の間だけDOループ内のステートメントを実行します。

例1: さまざまな形式の反復DOステートメントを使用する

  • 次の反復DOステートメントでは、startの値に項目のリストを使用します。
    • do month='JAN','FEB','MAR';
    • do count=2,3,5,7,11,13,17;
    • do i=5;
    • do i=var1, var2, var3;
    • do i='01JAN2001'd,'25FEB2001'd,'18APR2001'd;
  • 次の反復DOステートメントでは、start TO stop構文を使用します。
    • do i=1 to 10;
    • do i=1 to exit;
    • do i=1 to x-5;
    • do i=1 to k-1, k+1 to n;
    • do i=k+1 to n-1;
  • 次の反復DOステートメントでは、BY increment構文を使用します。
    • do i=n to 1 by -1;
    • do i=.1 to .9 by .1, 1 to 10 by 1,
         20 to 100 by 10;
    • do count=2 to 8 by 2;
  • 次の反復DOステートメントでは、 WHILE句とUNTIL句を使用します。
    • do i=1 to 10 while(x<y);
    • do i=2 to 20 by 2 until((x/3)>y);
    • do i=10 to 0 by -1 while(month='JAN');
  • この例では、I=1およびI=2の場合にDOループが実行されます。I=3の場合にWHILE条件が評価され、この条件が真の場合にDOループが実行されます。
    DO I=1,2,3 WHILE (condition);

例2: 無限ループを発生させずに反復DOステートメントを使用する

次のどちらの例でもDOグループを10回実行します。最初の例では推奨方法を示します。
   /* correct coding */
do i=1 to 10;
   ...more SAS statements... 
end;
次の例では、TO引数およびBY引数を使用します。
do i=1 to n by m;
   ...more SAS statements... 
   if i=10 then leave;
end;
if i=10 then put 'EXITED LOOP';

例3: DOループの実行を中止する

この例では、ループを終了させるために、インデックス変数の値をEXITの現在値に設定します。
data iterate1;
   input x;
   exit=10;
   do i=1 to exit;
      y=x*normal(0);
         /* if y>25,           */ 
         /* changing i's value */
         /* stops execution    */
      if y>25 then i=exit;
      output;
   end;
   datalines;
5
000
2500
;

関連項目:

前のページ|次のページ|ページの先頭へ