SAS宏用于绘图

时间:2017-11-17 21:47:29

标签: sas

我正试图制作一些情节。我需要制作19个散点图,将verf_typ_nmes中的名称替换为数据,然后逐步执行一个步骤然后执行。我研究了谷歌,并认为我正确复制但没有好处。

我得到的错误: “在%DO声明中未找到预期%TO”  错误:将编译虚拟宏。

%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;

1 个答案:

答案 0 :(得分: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;

如果可以避免,请不要使用逗号作为列表中的分隔符。逗号会使您在函数和宏调用中使用列表变得更加困难。