今回は、比較的よく使いそうなもので記述をちょっとだけ簡単にする方法を2つ紹介します。
%IFステートメントを使わない条件分岐
通常、マクロ内で条件分岐させるときに、
%if ~ %then ~ ;
%else ~ ;
のように記述します。
簡単な例として、「マクロ変数TYPEがTのときはOUT_TRUE1を出力、それ以外のときはOUT_FALSE1を出力」させる場合は、
%Macro TEST1(TYPE=) ;
%if &TYPE=T %then %let OUTDS1 = OUT_TRUE1 ;
%else %let OUTDS1 = OUT_FALSE1 ;
data &OUTDS1 ;
x = 1 ;
run ;
%Mend TEST1 ;
のように書いたりします。
%TEST1(TYPE=T) ; での実行結果は以下のとおりです。
%TEST1(TYPE=F) ; での実行結果は以下のとおりです。
次のような記述でも同じ結果を出すことができます。
%Macro TEST2(TYPE=) ;
%let OUTDS2 = %sysfunc(ifc(&TYPE=T,OUT_TRUE2,OUT_FALSE2)) ;
data &OUTDS2 ;
x = 1 ;
run ;
%Mend TEST2 ;
IFC関数を使用して、条件分岐を1行の記述で済ませることができます。
%TEST2(TYPE=T) ; での実行結果は以下のとおりです。
%TEST2(TYPE=F) ; での実行結果は以下のとおりです。
ただしこの記述方法、お気づきの方もいるかと思いますが、真か偽の2分岐でしか使えません。
%if ~ %then ~ ;
%else %if ~ %then ~ ;
%else ~ ;
のような条件分岐を作りたいときには使用できません。
あまり実用的ではないかもしれませんね・・・
=: 文字変数(文字列)の先頭○○バイトでの抽出
例えば以下のようなSASデータセットから、
変数Xの先頭1バイト目が"a"のレコードを抽出するときは、
data temp2_2 ;
set temp1 ;
where substr(x,1,1)="a" ;
put x = ;
run ;
このようにSUBSTR関数を使用して記述します。
結果は以下のとおりです。
これと同様の結果を、比較演算子=:を使用すると以下のように記述できます。
data temp2_1 ;
set temp1 ;
where x=:"a" ;
put x = ;
run ;
結果は以下のとおりです。
また、変数Xの先頭1バイト目が"a"または"A"のレコードを抽出するときは、
data temp3_1 ;
set temp1 ;
where lowcase(x)=:"a" ;
put x = ;
run ;
のようにLOWCASE関数(またはUPCASE関数)と併用することももちろん可能です。
以上2点、記述をちょっとだけ簡単にする方法を紹介しました。
今回は、記述を簡単にするという観点だけで取り上げました。
必ずしもこの記述方法がベストだというわけではありませんので上手く使い分けてくださいね。
投稿者:@Massu_NI
[google]
0 件のコメント:
コメントを投稿