SAS将宏功能的结果分配给数据步骤中的数组

时间:2012-02-09 17:16:02

标签: macros sas

此代码接受两个宏并将它们分配给数据步骤中的数组,然后循环遍历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)'.

1 个答案:

答案 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;

(注意,我没有测试过代码,但你应该得到一般的想法)