创建SAS宏以处理任意数量的变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建SAS宏以处理任意数量的变量相关的知识,希望对你有一定的参考价值。

我希望在SAS中创建一个宏,它将计算数据集中任意数量的数值变量(变量是参数并由用户输入)的平均值。我只知道如何逐个输入变量,并且不确定如何设置它,因此在调用宏时可以输入任意数量的变量,谢谢。

现在我有代码

%macro meanStat/parmbuff;
%put Syspbuff contains: &syspbuff;
proc means data = sashelp.baseball mean;
var &syspbuff;

%mend meanStat;

%meanStat(hits, runs)`

有了这个我得到错误:

错误22-322:语法错误,期望以下之一:名称,;,/,ALL,CHARACTER,CHAR,NUMERIC。

我也应该使用“parmbuff”

答案

不知道你为什么要这样做。最佳做法是使用SAS内置的快捷列表。

您可以将变量引用为:

*indexed list;
VAR var1-var20

*With common prefix;
var var: ; *will select all variables that start with var;

*with general reference;
var _numeric_ ; *runs for all numeric variables;

如果你想要一个宏,只要你传递一个空格分隔列表就没有问题。

%macro mean_useless(dsn=, var_list=);
  proc means data=&dsn;
  var &var_list;
  run;

%mend;

%mean_useless(dsn=sashelp.class, var_list = weight height age);
另一答案

您无需使用/parmbuff选项输入变量名称列表。只是不要在列表中使用逗号。你为什么要用逗号呢?

%macro meanStat(varlist);
proc means data = sashelp.baseball mean;
  var &varlist;
run;
%mend meanStat;

如果您确实想使用/parmbuff,请仔细查看传递给SYSPBUFF宏变量的值。它将包括()和逗号。对于你的问题,你也不想要。试试这个:

%macro meanStat/parmbuff;
%put Syspbuff contains: &syspbuff;
%put We want this: %sysfunc(translate(&syspbuff,%str( ),(,)));
%mend meanStat;

以上是关于创建SAS宏以处理任意数量的变量的主要内容,如果未能解决你的问题,请参考以下文章

SAS宏以dhms格式表示日期

扩展宏以进行调试?

在 SAS 中,如果空变量不存在,是不是有更快的方法来创建它?

将时间序列与变量具有相同名称的不同观察数量合并(SAS)

在 sas 中查找包含字母数字值的字符串

SAS 操作数据集的观测