【SAS】アルファベットや飛び飛びの値でもループしたい
SASの繰り返しのマクロである%do
ループでは%do i=1 %to 10
のように、整数値でしかループさせることができません。
今回は、整数以外でもループさせたいときの対処法をまとめてみます。
飛び飛びの値
飛び飛びの値とは、%do i=1 , 2, 3, 5
のように整数が連続していないループのこと。
この対処法については
データステップ100万回 SAS新手一生: マクロの%doループはループ値にリスト形式の離散値は指定できないので、工夫しようの話
にまとまってますが、おそらく最もシンプルで応用が利くのは以下のやり方です。
これを実行すると、A列に1があるというシンプルなデータセットmydata1, mydata2, mydata3, mydata5の4つがWORKライブラリに作成されます。
このコードでは、%let
でループに使う数字をマクロ変数で定義して%scan
で新しくjに代入しています。
なので、ここの%let
さえ変えてやれば文字だろうと数字だろうと自由にループを作成できます。
%sysfunc
は()の中身に関数を指定してそれを実行するマクロです。
アルファベット
例えば、上記と似たような感じでmydataA〜mydataEを作りたいことを考えます。(1~5でいいじゃんというツッコミは受け付けません。)
方法1 上記と同じように代入する
方法2 asciiコードを使う
SAS忘備録: DO i = 'A' to 'Z' ;
で紹介されている方法です。asciiコードとは、コンピュータにおける最も基本的な文字コードで、全部で128割り当てられているのですが、このうち10進数で言うところの65〜90にアルファベットのA〜Zが割り当てられています。そこで、SAS上でasciiコードを呼び出せるbyte()
関数を%sysfunc()
の中に入れて以下のように書きます。