如何在sas数据步骤中为每个观察执行一段宏?

Ste*_*eve 5 sas

假设我允许用户使用通用用户界面编写自己的变量计算宏:

%macro calculate(var_name, var_value);
%* Some user-defined calculation;
%mend calculate;
Run Code Online (Sandbox Code Playgroud)

然后在数据步骤中,我可以使用用户定义的宏计算新变量:

data dataset;
    set dataset;
    new_var = %calculate('variable1', variable1); * This doesn't work. It just shows my indication.
run;
Run Code Online (Sandbox Code Playgroud)

其中variable1是数据集中的变量.在这里,我想传递变量名称和变量的实际值.计算后,将值放在new_var中.

我怎样才能做到这一点?

cmj*_*hns 6

是否需要使用宏实现此目的?这听起来像是PROC FCMP最有用的情况,因为它允许您定义自己的函数或子例程(fcmp ="函数编译器"),它们可以像数据内置函数一样在数据步骤中使用.

这是一个简单的例子:

proc fcmp outlib=sasuser.funcs.math;
  function calc(var);
     newvar=log(var); /*user defined stuff here - can be simple or complex*/
     return(newvar);
  endsub;
run;

option cmplib=sasuser.funcs; /*tell SAS where to look for functions*/
data _null_;
  set sashelp.class;
  newvar=calc(height); /*call your new function */
  put newvar=;
run;
Run Code Online (Sandbox Code Playgroud)


Ani*_*iko 3

您可以完成此操作,但您可能错误地编写了宏。您必须记住,SAS 宏本质上是文本预处理器:它们输入您编写的代码并输出代码以馈送到 SAS [1]。

这是一个简单的“加法”宏:

%macro calculate (var_name, var_value);
  &var_name + &var_value;
%mend;

data one;
  input a@@;
  b = %calculate(a, 3);
  c = %calculate(a, a);
cards;
1 3 -2 4
;
run;

proc print data=one;
run;
Run Code Online (Sandbox Code Playgroud)

宏工具将%calculate用宏生成的代码替换这些位,SAS 实际上会看到以下内容:

%macro calculate (var_name, var_value);
  &var_name + &var_value;
%mend;

data one;
  input a@@;
  b = a + 3;
  c = a + a;
cards;
1 3 -2 4
;
run;

proc print data=one;
run;
Run Code Online (Sandbox Code Playgroud)

options mprint您可以在日志文件中使用以下语句亲自查看它

不幸的是,这并不能涵盖所有潜在的计算。您可能想要寻找PROC FCMP一种方法来生成可在 DATA 步骤中使用的自定义函数/子例程。

[1] 我知道事情比这更复杂,但你可以这样思考。