Macros SAS在数据步中将宏函数的结果分配给数组

Macros SAS在数据步中将宏函数的结果分配给数组,macros,sas,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; *c

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

如果您给我们提供%add_字符串宏的定义,这会有所帮助。在任何情况下,看起来都需要&ln_name是一个与&ln_vars中的列表匹配的变量列表,但每个变量都有后缀'\u 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;

(注意,我还没有测试代码,但您应该了解总体思路)

在尝试自动化之前,请编写代码,在分析中成功执行一次观察。发布代码(和示例数据),这样会更容易提供帮助。我想用下面注释掉的某个版本的call execute命令替换数据步骤中的&ln_名称。我试图避免将两个宏变量传递到数据步骤中。请参阅替代方法。您仍在引用我们看不到的宏,即%add_字符串。