如何为一组全局宏变量的条件创建(if ... then ...)编写简洁代码

时间:2015-04-16 05:13:08

标签: sas conditional-statements sas-macro

我已经创建了14个全局宏变量,如下所示:

data _NULL_;
set &medf;
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;

这似乎是一个效率低下的代码,因此我想知道如何能够更简洁地编写这个代码。我已经查看了CALL SYMPUTX的各种用法,看起来我可能不需要14行代码来处理14个全局宏变量(即,CALL SYMPUTX的单行可能就行了产生多个宏变量)。但是,我不确定如何在较少的代码行中保留变量创建的条件性质。

如果有人能提供一些指导,我会非常感激。谢谢!

1 个答案:

答案 0 :(得分:3)

假设每个&class1'的第一个字母是'可以形成一个后缀放置在宏变量名称的末尾,您可以完成此任务而无需if-then逻辑:

data _NULL_;
set &medf;
length suff $8;
i=1;
/* Do loop pulls together the first letter of each word */
/* in the &class1 variable value into a new variable called suff */
do while (scan(&class1,i) ^= '');
  suff=cats(suff,substr(scan(&class1,i),1,1));
  i+1;
end;

/* The Median and Frequency words joined to suff make the new macro variable name, */ 
/* the second argument just holds the values */
call symputx(cats('Median',suff),med);
call symputx(cats('Frequency',suff),_FREQ_);

run;