2016年1月22日金曜日

REPORTプロシジャ入門7:計算項目の追加【COMPUTE】




COMPUTEステートメントについて解説していきます。
重要な注意事項を含むので、ひと通り記事全体をご覧ください。



簡単な例

proc report data=SASHELP.CLASS nowd;
   column NAME HEIGHT WEIGHT FLAG;
   define NAME     / display;
   define HEIGHT  / display;
   define WEIGHT / display;
   define FLAG      / computed;
   
   compute FLAG;
      if HEIGHT > 65 or WEIGHT > 100 then FLAG = 1;
   endcomp;
run;



計算項目「FLAG」を作り、「HEIGHT > 65」or「WEIGHT > 100」の場合に「1」を格納しています。



構文解説

まずは作成する項目をCOLUMNステートメントに指定

   column NAME HEIGHT WEIGHT FLAG;


計算項目であることをDEFINEステートメントに定義しておきます
(「COMPUTED」と指定)

   define FLAG   / computed;


計算内容を「COMPUTE」~「ENDCOMP」内に記述します。
IF文や関数なども使えます。

   compute FLAG;
      if HEIGHT > 65 or WEIGHT > 100 then FLAG = 1;
   endcomp;



重要なのが「COLUMNステートメント」での「計算項目」の指定場所
「計算項目」は、計算時に参照しているどの項目よりも後に指定するのが安全


今回の例で説明すると、
「FLG」の計算には、「HEIGHT」「WEIGHT」を参照しています。

   compute FLAG;
      if HEIGHT > 65 or WEIGHT > 100 then FLAG = 1;
   endcomp;



なので、COLUMNステートメントでは「HEIGHT」「WEIGHT」の後に「FLAG」を指定しています。

   column NAME HEIGHT WEIGHT FLAG;


(SASが内部で処理する順番が関係していそうですが、内部の話なので、明確な理由が説明できません。。)




文字項目を追加する例

proc report data=SASHELP.CLASS nowd;
   column NAME SEX NEWVAR;
   define NAME      / display;
   define SEX         / display;
   define NEWVAR  / computed;
   
   compute NEWVAR / character length=20;
      NEWVAR = compress( NAME || "-" || SEX );
   endcomp;
run;



「NAME」と「SEX」を横棒でつないでくっつけた計算項目「NEWVAR」を作っています。



計算項目が文字の場合は、COMPUTEステートメントで以下のようにLENGTHを定義しておきます。

  COMPUTE  計算項目名  /  CHARACTER LENGTH = 長さ ;



0 件のコメント:

コメントを投稿