2014-04-04 100 views
0

我有一個公司ID和日期的列表,我想在這個列表上運行一個宏,使得每個日期的所有公司ID都需要被視爲我的宏過濾。基於SAS中的日期值的宏變量創建

例如,我的清單 -

DATA comp_date_list; 
    INPUT compno sdate; 
    DATALINES; 
    12490 20090120 
    87432 20090120 
    24643 20090120 
    87432 20090119 
    12490 20090105 
    24643 20090105 
    ; 
    proc print data=comp_date_list; 
    run; 

現在,我有一個宏如下: -

%macro1(compno=,sdate=,threshold=,fdate=,edate=) 

現在宏必須在每一個補償的最新組合,運行我的名單。但是由於這是在一個非常大的數據集上運行,因此運行n次需要很長時間。所以爲了減少運行時間,我打算爲給定的日期製作一個compnos列表,並改變我的宏以產生一個日期的結果。

現在我的問題是如何創建一個宏變量,它具有給定日期的所有資源,並且隨日期變化而變化?對於宏觀寫作和SAS來說是新的。所以請原諒我的無知。謝謝!

+0

使用'by'處理通常比使用宏遍歷所有值/參數更有效率,只要您可以適當地構造代碼即可。你能提供一個macro1代碼的例子嗎? –

+0

macro1代碼是一個計算大型金融數據集某些值的大型代碼。我的老闆不想改變代碼的那一部分。 – RHelp

回答

1

datastep中的call execute語句可以在調用它的datastep後運行選擇性代碼(在本例中爲您的宏)。例如,以下內容應該適用於您: -

proc sort data = comp_date_list; 
    by sdate compno; 
data _null_; 
    set comp_date_list; 
    by sdate; 

    attrib all_comps_on_date length=$1000 label="All_comps_on_date: '|' separated company numbers for date"; 
    retain all_comps_on_date ""; 

    if first.sdate then all_comps_on_date = ''; 
    all_comps_on_date = catx('|', all_comps_on_date, compno); 
    if last.sdate then call execute('%macro1(compno='||strip(all_comps_on_date)||',sdate=,threshold=,fdate=,edate=)'); 
run; 

儘管如此, call execute可以嚴重破壞宏自己創造宏觀變量(特別是如果他們使用call execute語句!)

我也只能隨聲附和@ChrisJ並補充說,雖然SAS宏可能是有用的,維護和調試他們是一個痛苦我只用它們作爲最後的手段。遺留代碼當然沒有多少幫助!

+0

謝謝!這可能會有所幫助。我會盡力讓你知道 – RHelp