此代码接受两个宏并将它们分配给数据步骤中的数组,然后循环遍历ln_vars中定义的每个变量,创建一个新变量,该变量是变量的自然日志,将_ln追加到名称
%let ln_vars = var1 var2;
%let ln_names = %add_string(&ln_vars, _ln);
data transform;
set analysis;
array ln &ln_vars;
array ln_n &ln_names;
*call execute ('%add_string(%str(&ln_vars), _ln)');
do over ln;
ln_n = log(ln);
end;
run;
也许在sas代码中有一个更好的习语(我希望)。 我希望能够只传递一个宏(ln_vars宏)并从数据步骤中调用%add_string()函数。 注释'call execute'返回正确的字符串,但是当我尝试
时1588 array ln_n call execute ('%add_string(%str(&ln_vars), _ln)');
ERROR: Attempt to initialize variable call in numeric array ln_n with character constant
'%add_string(%str(&ln_vars), _ln)'.
答案 0 :(得分:2)
如果你给我们%add_string宏的定义会有所帮助。在任何情况下,看起来你需要& ln_names作为与& ln_vars中的列表匹配的变量列表,除了每个变量都有后缀'_ln'。
如果我是正确的,你真的不需要%add_string宏,而是可以这样做:
%let ln_vars = var1 var2;
%let ln_names = %sysfunc(tranwrd(&ln_vars,%str( ),%str(_ln )))_ln;
%put LN_VARS: &ln_vars;
%put LN_NAMES:&ln_names;
data transform;
set analysis;
array ln &ln_vars;
array ln_n &ln_names;
do over ln;
ln_n = log(ln);
end;
run;
请注意,两个%put语句并不是必需的 - 它们只是放在那里检查两个宏变量的值
根据你的评论,你可以有一个宏:
%macro lnvars(vars=,suffix=_ln);
%let newvars=%sysfunc(tranwrd(&vars,%str( ),%str(&suffix )))&suffix;
array ln &vars.;
array ln_n &newvars.;
do over ln;
ln_n = log(ln);
end;
%mend;
然后从数据步骤中调用宏,如下所示:
data transform;
set analysis;
%lnvars(vars=var1 var2);
run;
(注意,我没有测试过代码,但你应该得到一般的想法)