创建 SAS 宏来处理任意数量的变量
Posted
技术标签:
【中文标题】创建 SAS 宏来处理任意数量的变量【英文标题】:Creating SAS Macro to handle arbitrary number of variables 【发布时间】:2018-03-06 05:25:09 【问题描述】:我希望在 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 , 数字。
我也应该使用“parmbuff”
【问题讨论】:
为什么必须是宏?为什么不能使用proc summary
?如果您提供一个虚拟示例来说明您的输入和预期输出是什么样的,也许会更容易为您提供帮助。
如果 variables 是指典型的 SAS 意义(即数据集列),那么您可能需要查看 array
。
好的,我用一些更新的信息/我现在拥有的信息编辑了这个问题,如果有帮助的话。它必须是一个宏,用于赋值。
如何输入变量名?他们正在被验证吗?如果作业是需要 syspbuff 的作业,我会说这是一个糟糕的问题。使用 OPTIONS MPRINT 运行代码,日志将显示您需要从 SYSPBUFF 中删除括号和逗号。您可以使用 %SYSFUNC(COMPRESS(...)) 在 &SYSPBUFF 上调用 COMPRESS 函数(其目的是从值中删除字符)
【参考方案1】:
不知道你为什么要这样做。最佳实践是使用 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);
【讨论】:
【参考方案2】:您不需要使用/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 宏来处理任意数量的变量的主要内容,如果未能解决你的问题,请参考以下文章