2017-05-31 550 views
1

首先,我是新的,所以如果這不是一個好問題,我很抱歉。我搜查了但沒有發現類似的東西。我不確定我的方法是否正確,因此我們將不勝感激。SAS通過宏變量列表循環

我正在爲一所有學期的學校提供​​數據集,例如2017SP是2017年春季,2017SU是2017年夏季等。

我有以下程序,我在上面設置了一個宏變量,然後用它從各種庫和數據集中抽出這個術語。請注意,我有幾個數據步驟,只需要運行整個程序5次以上。

%let STC_TERM=2017SU;

Data Step; set (library that has data on all terms); if STC_TERM = "&STC_TERM"; *other things I want to do* run; 我在我的節目其他幾個類似的數據的步驟,最後給我我想要的輸出數據。

現在我需要創建一個數據集,每個學期只需附加五個學期的數據。

而不是運行我的代碼5次,只是改變「%let STC_TERM = 2017SU;」到 「%let STC_TERM = 2016SU;」對於我想要的每一年,我都希望能夠提供5個術語的列表,並通過5個術語中的每一個讓SAS循環,並將結果附加在一起。

五個條款是(2017年,2016年,2015年,2014年,2013年)。

有沒有辦法將這個清單給我的程序,讓它在2017SU首先執行所有的數據步驟,然後在下一個學期等等,並將結果附加在一起?

我不能只在數據步驟中放入所有感興趣的術語,因爲一些術語在它們之間有重複的數據,需要單獨處理。試圖把所有的術語放在數據步驟之前並不適用於我,所以我想通過每個學期單獨運行整個程序來分開它們。

+0

可能的複製https://stackoverflow.com/questions/18667379/simple-iteration-through-array-with-proc-sql-in-sas ) – DomPazz

+0

重複的https://stackoverflow.com/questions/18667379/simple-iteration-through-array-with-proc-sql-in-sas/18667497#18667497。那個問題是要求PROC SQL,但是數據步驟可以很容易地被替換。 – DomPazz

+0

對不起,我不明白這是同一個問題。他只有一個程序。我有幾個數據步驟(共12個),其中一些使用宏變量。我不希望對每一個數據步驟進行更改。應該有一種方法來運行整個程序,使用頂部宏變量指定的不同學期。 – elfrozo

回答

3

只需將您現有的代碼包裝在宏中,並讓宏遍歷值列表。再看另一個例子:Simple iteration through array with proc sql in SAS

如果你想積累結果到一個表中,然後在你的代碼的末尾添加一個PROC APPEND步驟。

%macro do_all(termlist); 
    %local i stc_term ; 
    %do i=1 %to %sysfunc(countw(&termlist,%str())); 
    %let STC_TERM=%scan(&termlist,&i,%str()); 

data step1; 
    set have ; 
    where STC_TERM = "&STC_TERM"; 
    * ... other things I want to do in this step ... ; 
run; 
... 
data step_last; 
    set stepX; 
    ... 
run; 

proc append base=all data=step_last force ; 
run; 

    %end; 
%mend do_all; 

然後用值列表調用它。

%do_all(2017SU 2016SU 2015SU 2014SU 2013SU) 
[通過與SAS PROC SQL陣列簡單迭代](的
+0

非常感謝你。這是有道理的,我現在知道如何去做。你的代碼對我來說非常合適。 – elfrozo