2017-11-17 119 views
0

我正在嘗試繪製一些圖。我需要用verf_typ_nmes中的名稱將19個散點圖代入數據和執行步驟,然後執行一次。我研究過谷歌,並認爲我複製正確,但沒有好處。SAS繪製的宏

我得到的錯誤: 「預計%未在%DO語句中找到」 錯誤:將編譯一個虛擬宏。

%macro Multiplot(); 
    %do verf_typ_nmes = BDPREP, BRCODE, CONTNT, COPAL, CURSRY, 
         DFTEST,DOCPST,DSMS,LABEL,MAILING,       
         MAILPC,MERLIN,MMS,MPCV,PRESRT,PVDS,           
         SHPAID,TAP,WEIGHT; 
    data &verf_typ_nmes; 
    set vol_verfns_prime; 
    where verif_type="&verf_typ_nmes"; 
    RUN; 
    proc sgscatter data=&verf_typ_nmes; 
    plot verif_pstg*(t_v tfev mlgs fsp avpm); 
    run; 
    %end; 
%mend; 

回答

2

%DO說法是不作爲DO聲明一樣強大。

爲什麼不只是使用BY聲明?

proc sgscatter data=vol_verfns_prime; 
    by verif_type ; 
    where verif_type in ('BDPREP' 'BRCODE' .....); 
    plot verif_pstg*(t_v tfev mlgs fsp avpm); 
run; 

如果你需要循環的名單,然後把名單在宏變量和使用%scan()逐一拉出值。

%let list= 
    BDPREP BRCODE CONTNT COPAL CURSRY DFTEST DOCPST DSMS LABEL 
    MAILING MAILPC MERLIN MMS MPCV PRESRT PVDS SHPAID TAP WEIGHT 
; 
%do i=1 %to %sysfunc(countw(&list)); 
    ... 
    where verif_type="%scan(&list,&i)"; 
    ... 
%end; 

如果可以避免,請不要在列表中使用逗號作爲分隔符。逗號將使它更難在函數和宏調用中使用你的列表。

+2

或者至少跳過數據步驟,並在'SGSCATTER'上的數據集選項中放置where ...但是,在大多數情況下,'BY'選項似乎最正確。 – Joe