全局宏变量(使用CALL SYMPUTX创建)将无法在SAS宏程序中正确解析

时间:2015-04-15 05:57:30

标签: sas sas-macro

我对SAS中的宏编码非常陌生,所以我主要是在朝着正确的方向努力。

我正在尝试创建一个大的宏程序,在其中我使用CALL SYMPUTX来创建我在宏程序中引用的几个全局宏变量。我的代码如下:

options symbolgen mlogic;
filename ALBB 'C:\[file path]\AL.csv';
libname mylibx 'C:\[file path]\ALBB';

%macro baseball(al=mylibx.al, nl=myliby.nl, var1=salary, class1=position, pd=percent_deviation);

data &al;
infile ALBB dlm=',' dsd firstobs=5 obs=381;
input team :$20. name :$20. salary :comma12. position :$20.;
run;

proc print data=&al (firstobs=1 obs=6);
format &var1 comma12.;
run;

proc means data=&al noprint;
var &var1;
class &class1;
output out=med_al median=med;
run;

data median_al;
set med_al;
if _TYPE_ = 0 then delete;
run;

****Macro Variables in question are below****
data _NULL_;
set &al;
    if &class1='Catcher' then call symputx('MedianC',med);
    if &class1='Catcher' then call symputx('FrequencyC',_FREQ_);
    if &class1='First Baseman' then call symputx('MedianFB',med);
    if &class1='First Baseman' then call symputx('FrequencyFB',_FREQ_);
    if &class1='Outfielder' then call symputx('MedianO',med);
    if &class1='Outfielder' then call symputx('FrequencyO',_FREQ_);
    if &class1='Pitcher' then call symputx('MedianP',med);
    if &class1='Pitcher' then call symputx('FrequencyP',_FREQ_);
    if &class1='Second Baseman' then call symputx('MedianSB',med);
    if &class1='Second Baseman' then call symputx('FrequencySB',_FREQ_);
    if &class1='Shortstop' then call symputx('MedianS',med);
    if &class1='Shortstop' then call symputx('FrequencyS',_FREQ_);
    if &class1='Third Baseman' then call symputx('MedianTB',med);
    if &class1='Third Baseman' then call symputx('FrequencyTB',_FREQ_);
run;

data temp;
set &al;
    if &class1='Catcher' then &pd=((&var1-&MedianC)/(&MedianC))*100;
    if &class1='First Baseman' then &pd=((&var1-&MedianFB)/(&MedianFB))*100;
    if &class1='Outfielder' then &pd=((&var1-&MedianO)/(&MedianO))*100;
    if &class1='Pitcher' then &pd=((&var1-&MedianP)/(&MedianP))*100;
    if &class1='Second Baseman' then &pd=((&var1-&MedianSB)/(&MedianSB))*100;
    if &class1='Shortstop' then &pd=((&var1-&MedianS)/(&MedianS))*100;
    if &class1='Third Baseman' then &pd=((&var1-&MedianTB)/(&MedianTB))*100;
run;

proc print data=temp (firstobs=1 obs=10);
title 'Information about Baseball Players';
footnote1 %sysfunc(putn(&MedianC, dollar12.)) &FrequencyC;
footnote2 %sysfunc(putn(&MedianFB, dollar12.)) &FrequencyFB;
footnote3 %sysfunc(putn(&MedianO, dollar12.)) &FrequencyO;
footnote4 %sysfunc(putn(&MedianP, dollar12.)) &FrequencyP;
footnote5 %sysfunc(putn(&MedianSB, dollar12.)) &FrequencySB;
footnote6 %sysfunc(putn(&MedianS, dollar12.)) &FrequencyS;
footnote7 %sysfunc(putn(&MedianTB, dollar12.)) &FrequencyTB;
run;

%mend baseball;
%baseball()

虽然我不确定我是否正确地执行了此操作,但我的'MedianX''FrequencyX'宏变量无法正常工作。他们解决了缺失值(而在宏程序之外,它们正确解析)。

有人可以提供一些指导吗?非常感谢!

1 个答案:

答案 0 :(得分:4)

将其复制到SAS中会显示数据空语句行28被删除,因为第27行上的注释没有结束的半冒号。有了这个补充,根据我制作的电子表格,这对我有用。

此外, null 和临时表已设置& al这是您的第一个数据集,因此不包含med和 FREQ 变量,这些变量应读取中位数_al为这要正确解决。