2013-06-20 113 views
-1

這是我的第一個宏,所以如果我錯過了簡單的東西,我很抱歉。SAS宏做數據步驟循環

我需要做相同的數據步驟六(或更多)次,並追加每一個到第一個,所以我嘗試了一個宏內的do循環。一切工作與循環刪除,但一旦添加循環,我得到的錯誤,要麼說我有一個額外的%末端或多餘的%修補。所有想法都歡迎。謝謝!

%macro freeze_samples(orig_file=, samples= , Start_Freeze_Incr=, 
      End_Freeze_Incr=); 
%do i = 1 %to &samples; 

data freeze_slice_&i; 
    set &orig_file; 

    (do stuff) 

run; 

    * If we have more than one slice, append to previous slice(s).; 
    %if &i > 1 %then %do; 
     proc append base = temp_1 data = temp_&i; 
     run; 
    %end; 

%end; 

%mend; 
+0

這是一個非問題,可以通過重新啓動SAS會話來解決。 – JustinJDavies

回答

4

我認爲你要麼有一個問題,你沒有在文本包括(即「做的東西」一節),或者你有一個壞的會話(即,你解決了這個問題,但沒有從什麼東西以前的運行搞亂了一些東西)。這運行正常(因爲我不知道你在做什麼):

%macro freeze_samples(orig_file=, samples= , Start_Freeze_Incr=, 
      End_Freeze_Incr=); 
%do i = 1 %to &samples; 

data freeze_slice_&i; 
    set &orig_file; 

    *(do stuff); 

run; 

    * If we have more than one slice, append to previous slice(s).; 
    %if &i > 1 %then %do; 
     proc append base = freeze_slice_1 data = freeze_slice_&i; 
     run; 
    %end; 

%end; 

%mend; 

%freeze_samples(orig_file=sashelp.class,samples=2,start_freeze_incr=1,end_freeze_incr=5); 

我要指出,你可能會更好過沒有做任何你正在做的這樣;在SAS中,通常比將數據分成多個數據集更好。但是因爲我不知道自己在做什麼,所以我不能建議更好的方法,除了推薦閱讀this article並牢記它(即使你做了與自舉不同的事情,這個概念幾乎適用於SAS )。

+0

感謝您的幫助。在我做的所有谷歌搜索中,我從來沒有找到那篇特別的文章。缺失的代碼通過選擇一個範圍內的隨機日期從當前數據中採樣,然後記錄哪個研究樣本在隨機選擇的日期之後的日期範圍內凍結。 – VillageCat

+1

喬,你是對的 - 一旦我重新啓動SAS,代碼工作。 *臉掌* – VillageCat