【问题标题】:Creating SAS Macro to handle arbitrary number of variables创建 SAS 宏来处理任意数量的变量
【发布时间】: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 函数(其目的是从值中删除字符)

标签: macros sas


【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多