SAS Do循环:在循环内使用循环变量来创建滞后变量

时间:2014-09-17 18:55:52

标签: sas sas-macro

我想创建包含大量滞后的给定变量的滞后值的变量。我怎么能这样做?我尝试以下方法:

data out; 
set in;
do i = 1 to 50;
%let j = i;
lag_&j = Lag&j.(x);
end;
run;

如何将循环变量i放入宏变量j或如何直接使用它来创建适当命名的变量和滞后函数?

2 个答案:

答案 0 :(得分:5)

Chris J回答了这个问题,但在这里我将提供我这样做的首选方法。

%macro lagvar(var=,num=);
  %do _iter = 1 %to &num.;
    lag_&_iter. = lag&_iter.(&var.);
  %end;
%mend lagvar;

data out;
  set in;
  %lagvar(var=x,num=50); *semicolon optional here;
run;

这是宏循环的更模块化使用(并且更具可读性,假设您使用智能名称 - 上面没关系,如果您想要非常清楚,可以使用名称做更多,当然还要添加注释)。

答案 1 :(得分:3)

你正在混合宏观& datastep语法错误...

您需要一个宏循环(%DO而不是do)来生成datastep代码(即lag1-lag50),并且宏循环需要在宏内。

%MACRO LAGLOOP ;
  data out ;
    set in ;
    %DO J = 1 %TO 50 ;
      lag_&J = lag&J(x) ;
    %END ;
  run ;
%MEND ;
%LAGLOOP ;