好久沒有寫SAS的文章了,最近有機會去上SAS Macro Language 1: Essentials 的課程,想整理上課的一些筆記,也和大家分享一些SAS Macro 的內容。我本來就有在寫SAS Macro,但是從來沒有上過完整的課程。這個課程很精實,在兩天內把Macro 可能用到的基礎課程做了一個整理。我也藉著課程了解macro 的運行邏輯。
What’s Macro is SAS
首先來和大家分享什麼是SAS Macro,在寫R or Python 的時候,我們可以指定變數,比如,讓X指定是10
X=10
但是在SAS,不能直接寫 X=10 ,需要一些指定的符號來啟用macro。另外,在SAS裡面如果要寫 loop 迴圈的話,也需要Macro definition來寫,這部分可能無法在今天一起解釋。我們今天先介紹基本的macro variable
SAS Macro 怎麼使用
- 我們需要用 % & 符號來啟動 Macro,這兩個符號也是 Macro trigger。當一段SAS BASE 程式裡面有 % & 的符號時,會先把 Macro variable 解開
- Macro 是使用文字,所以有很多時候不需要引號
- 在跑程式的時候,會先解 macro ,之後再跑 SAS base
基本的Macro 寫法
Put
- 需要 % 來啟動 put
- Put 是很簡單的macro 函數,可以直接寫到log上面
- 並且 %put 不需要引號
- 如果寫 NOTE、WARNING、ERROR 都會換顏色
可以使用上面的方法,在寫判斷的時候跑出log,可以使用顏色來判斷
%put hello;
%put NOTE: hello, change color;
%put WARNING: BLUE color for warning;
%put ERROR: red color;

使用 put 來展示
%put &=name;%put &name;找name的內容是什麼%put <text>&name<text>;印出一段文字
%let name= Max;
%put &=name;
%put &name;
%put My name is &name;

使用 %let 來宣告 macro variable
%let name=value;- value: macro 值
- name: macro variable
- 大小寫有差
- 會自動刪除空白
- 沒有數字,以text為主
- 最多可以存 64 K
%let type=Truck;
%let hp=250;
%let type= Sports ;
%let origin=" Europe ";
%let value=;
%let sum=3+4;
%let varlist=Make Model Type;
%put &=type;
%put &=hp;
%put &=type;
%put &=origin;
%put &=value;
%put &=sum;
%put &=varlist;

使用 & 來呼叫
- 能夠將macro variable 呼叫回來
- 如果放在文字裡面需要雙引號
%put &=name;
%let type=BMW;
proc freq data=sashelp.cars;
table Model;
where Make="&type";
run;


使用 %symdel 刪除macro variable
%symdel list of variable names;- 使用%let 寫的macro variable 都是 global 的,要自己主動刪除,才會刪除 (之後會講到 global 和 local 的差別)
%symdel name hp type origin;
其他的put 用法
- 可以使用
%put _automatic_;找到 SAS 裡面的 Automatic macro variable- 可以利用 Automatic macro variable 來使用
- 可以使用
%put _user_;找到我們宣告的 macro variable


使用 options 來偵錯 SAS Macro Debugging
Options symbolgen;- 巨集變數(
&var)被展開成什麼值 - 巨集變數是不是抓錯、變數名稱是否拼錯
- 巨集變數(
Options mlogic;- Macro 程式的邏輯流程:IF/ELSE、DO 循環、條件判斷
- Macro 的控制流程是否如預期
Options mprint;- Macro 展開後,實際送到 SAS compiler 的 DATA step / PROC 程式碼
- 確認巨集產生的程式碼是否正確
option mcompilenote = ALL|NONE;- 檢查macro 錯誤
還沒講到 macro definition,偵錯 的部分就大家可以先試試看怎麼使用
其他要注意的: 在使用 macro 的時候,macro variable 後面的小數點會被吃掉
- 使用的時機是文字必須黏在macro variable之後的時候
- 如果需要小數點,可以使用兩個小數點,一個會被吃掉
%let type=Truck“&type.s" ⇒ Trucks
今天就介紹最基本的 macro variable,之後再寫如何用 SQL/ data set 建立 macro variable








