前のページ|次のページ

RETAINステートメント

DATAステップを繰り返す際に、INPUTステートメントまたは割り当てステートメントで作成される変数の値を保持します。

該当要素: DATAステップ
カテゴリ: 情報
種類: 宣言

構文

引数なし

引数を指定しない場合、DATAステップを繰り返す際に、RETAINステートメントはINPUTステートメントまたは割り当てステートメントで作成されるすべての変数の値を保持します。

引数

element-list

値を保持する変数名、変数リスト、配列名を指定します。

ヒント _ALL_、_CHAR_、_NUMERIC_を指定する場合、RETAINステートメントの前に定義した変数のみに影響します。
変数名がRETAINステートメントにのみ指定されている場合に、その初期値を指定しないと、この変数はデータセットに書き込まれず、変数が初期化されていないことを示す注釈がSASログに書き込まれます。初期値を設定すると、この変数はデータセットに書き込まれます

initial-value

直前に指定した1つまたは複数の要素に対し、初期値(数値または文字)を指定します。

ヒント initial-valueを省略すると、初期値は欠損値になります。Initial-valueは、その前にあるリストのすべての要素に割り当てられます。このため、変数リストのすべてのメンバに同じ初期値が割り当てられます。
参照項目 (initial-value)および(initial-value-list)

(initial-value)

直前に指定した1つの要素、または要素リストにある最初の要素に対し、初期値(数値または文字)を指定します。

(initial-value-list)

直前に指定したリストにある各要素に対し、初期値(数値または文字)を指定します。このリストの最初の値を要素リストの最初の変数に、2番目の値を要素リストの2番目の変数に割り当てます。

要素の文字値は引用符で囲みます。1つまたは複数の初期値を直接指定するには、次の形式を使用します。
(initial-value(s))
繰り返しの回数とネスト形式のサブリストを初期値に指定するには、次の形式を使用します。
<constant-iter-value*> <(>constant value | constant-sublist<)>
制限事項 initial-value-listelement-listの両方を指定する場合、RETAINステートメントではelement-listinitial-value-listより前にリストする必要があります。
ヒント ブランクまたはカンマで複数の初期値を区切ることができます。
連続する整数値の範囲を指定する場合は、簡略化した表記を使用できます。増分は常に+1になります。
変数と一時データ要素の両方に初期値を割り当てることができます。
指定した初期値の数よりも変数の数が多い場合、初期値が割り当てられなかった変数には欠損値が割り当てられ、警告メッセージが発行されます。

詳細

DATAステップのデフォルトの動作

RETAINステートメントを使用しない場合、DATAステップを繰り返す前に、INPUTステートメントまたは割り当てステートメントを使用して割り当てられる変数は欠損値に設定されます。

初期値の割り当て

個別の変数、変数リスト、配列のメンバに初期値を指定するには、RETAINステートメントを使用します。RETAINステートメントに値が表示される場合、リスト内でこの値より前に表示される変数の初期値は表示された値に設定されます。(RETAINステートメントで同じ変数に異なる初期値を複数回指定した場合、最後の値が初期値として使用されます。)RETAINステートメントを使用すると、合計ステートメントで割り当てられた変数の値にデフォルト値0以外の初期値を設定することもできます。

指定の重複

RETAINステートメントで次の項目を指定すると、指定が重複することになります。次に示す項目の値は自動的に保持され、DATAステップの繰り返しの際に使用されます。
  • SET、MERGE、MODIFY、UPDATEの各ステートメントで読み込まれる変数
  • 合計ステートメントで値が割り当てられた変数
  • 自動変数_N_、_ERROR_、_I_、_CMD_、および_MSG_
  • SET、MERGE、MODIFY、UPDATEの各ステートメントでEND=またはIN=オプションを指定するか、FILEおよびINFILEの各ステートメントで変数を作成するオプションを指定して作成された変数
  • 一時配列で指定されたデータ要素
  • ARRAYステートメントで初期化された配列要素
  • ARRAYステートメントで任意の要素またはすべての要素に初期値が割り当てられた配列要素
ただし、RETAINステートメントを使用して前述の項目に初期値を割り当てることができます。自動変数_N_と_ERROR_には、初期値を設定できません。

比較

RETAINステートメントでは、DATAステップの繰り返しの初めに欠損値に設定されない変数を指定します。KEEPステートメントでは、作成されるデータセットに書き込む変数を指定します。

例1: 基本的な使用

  • 次のRETAINステートメントでは、変数MONTH1からMONTH5の値を保持し、DATAステップの繰り返しで使用します。
    retain month1-month5;
  • 次のRETAINステートメントでは、9個の変数の値を保持し、その初期値を設定します。
    retain month1-month5 1 year 0 a b c 'XYZ';
    変数MONTH1からMONTH5の初期値は1、YEARの初期値は0、変数A、B、Cの初期値は文字列値XYZにそれぞれ設定されます。
  • 次のRETAINステートメントでは、変数MONTH1にのみ初期値1を割り当てます。
    retain month1-month5 (1);
    変数MONTH2からMONTH5の初期値は欠損値に設定されます。
  • 次のRETAINステートメントでは、DATAステップの上部で定義されたすべての変数の値が保持されますが、その後で定義された値は保持されません。
    retain _all_;
  • 次の場合、どのステートメントを実行しても変数VAR1からVAR4に初期値1から4が割り当てられます。
    • retain var1-var4 (1 2 3 4);
    • retain var1-var4 (1,2,3,4);
    • retain var1-var4(1:4);

例2: RETAINステートメントの操作概要

この例は、RETAINステートメントの要素として変数名と配列名を使用する方法を示しています。割り当てる初期値はかっこで囲まれているものと、かっこで囲まれていないものがあります。
data _null_;
   array City{3} $ City1-City3;
   array cp{3} Citypop1-Citypop3;
   retain Year Taxyear 1999 City ' ' 
          cp (10000,50000,100000);
   file file-specification print;
   put 'Values at beginning of DATA step:' 
       / @3 _all_ /;
   input Gain;
   do i=1 to 3;
      cp{i}=cp{i}+Gain;
   end;
   put 'Values after adding Gain to city populations:'
       / @3 _all_;
   datalines;
5000
10000
;
RETAINステートメントで割り当てられた初期値は次のようになります。
  • YearとTaxyearの初期値は1999になります。
  • City1、City2、City3には欠損値が割り当てられます。
  • Citypop1には10000が割り当てられます。
  • Citypop2には50000が割り当てられます。
  • Citypop3には100000が割り当てられます。
PUTステートメントで書き込まれた行を次に示します。
Values at beginning of DATA step:City1=  City2=  City3=  Citypop1=10000 Citypop2=50000 Citypop3=100000 Year=1999 Taxyear=1999 Gain=. i=._ERROR_=0 _N_=1 Values after adding GAIN to city populations:City1= City2= City3= Citypop1=15000 Citypop2=55000 Citypop3=105000 Year=1999 Taxyear=1999 Gain=5000 i=4 _ERROR_=0 _N_=1 Values at beginning of DATA step:City1=  City2=  City3=  Citypop1=15000 Citypop2=55000 Citypop3=105000 Year=1999 Taxyear=1999 Gain=. i=._ERROR_=0 _N_=2 Values after adding GAIN to city populations:City1= City2= City3= Citypop1=25000 Citypop2=65000 Citypop3=115000 Year=1999 Taxyear=1999 Gain=10000 i=4 _ERROR_=0 _N_=2 Values at beginning of DATA step:City1=  City2=  City3=  Citypop1=25000 Citypop2=65000 Citypop3=115000 Year=1999 Taxyear=1999 Gain=. i=._ERROR_=0 _N_=3
最初のPUTステートメントは3回実行されていますが、2番目のPUTステートメントは2回しか実行されていません。3回目のINPUTステートメントを実行してENDステートメントに到達すると、DATAステップは終了します。

例3: 複数のオブザベーションから1つの値を選択する

この例のデータセットALLSCORESIDには、個々のID番号および変数IDに対して複数のオブザベーションが含まれています。ある1つのID値を持つ複数のオブザベーションでは、変数GRADEの値が異なる場合があります。ここでは、新しいデータセットCLASS.BESTSCORESを作成します。作成される新しいデータセットには、IDの値ごとに1つのオブザベーションが含まれます。BESTSCORESデータセットのオブザベーションは、IDが同じすべてのオブザベーションのうちで変数GRADEの値が最も大きいオブザベーションになります。
libname class 'SAS-library';
proc sort data=class.allscores;
   by id;
run;
data class.bestscores;
   drop grade;
   set class.allscores;
   by id;
      /* Prevents HIGHEST from being reset*/
      /* to missing for each iteration.   */
   retain highest;
      /* Sets HIGHEST to missing for each */
      /* different ID value.              */
   if first.id then highest=.;
      /* Compares HIGHEST to GRADE in     */
      /* current iteration and resets     */
      /* value if GRADE is higher.        */
   highest=max(highest,grade);
   if last.id then output;
run;

関連項目:

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