2017-11-17 115 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