我已经创建了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
的单行可能就行了产生多个宏变量)。但是,我不确定如何在较少的代码行中保留变量创建的条件性质。
如果有人能提供一些指导,我会非常感激。谢谢!
答案 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;