创建 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:语法错误,需要以下之一:名称、;、/、ALLCHARACTERCHAR , 数字

我也应该使用“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 宏来处理任意数量的变量的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用具有任意数量元素的占位符创建 python 字符串

如何使用任意数量的通道创建图像? (蟒蛇)

创建具有不确定数量参数的 Oracle 函数/宏

如何为任意数量的变量运行一种方法[重复]

仅当没有给定前缀具有任意数量的空格时才匹配单词