【问题标题】:SAS assign results from macro function to array within data stepSAS将宏函数的结果分配给数据步骤中的数组
【发布时间】:2012-02-09 17:16:01
【问题描述】:

此代码采用两个宏并将它们分配给数据步骤中的数组,然后循环遍历 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() 函数。 注释的“调用执行”返回正确的字符串,但是当我尝试

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)'.

【问题讨论】:

  • 在您尝试自动化之前,编写能够成功执行的代码,以便在分析中进行一次观察。发布该代码(和示例数据),它会更容易提供帮助。
  • 上面的代码有效。我想用下面注释掉的调用执行命令的某个版本替换数据步骤中的 &ln_names。

标签: macros sas


【解决方案1】:

如果您向我们提供 %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;

(注意,我没有测试过代码,但你应该知道大致的想法)

【讨论】:

  • 我试图避免将两个宏变量传递到数据步骤中。
  • 查看替代方案。您仍在引用我们看不到的宏,即 %add_string.
猜你喜欢
  • 2016-02-01
  • 2010-10-29
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多