★データ解析備忘録★

ゆる〜い技術メモ

【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()の中に入れて以下のように書きます。