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

SAS Do循环:在循环内使用循环变量创建滞后变量,sas,sas-macro,Sas,Sas Macro,我想为大量滞后创建包含给定变量滞后值的变量。我怎么能这样做?我尝试以下方法: data out; set in; do i = 1 to 50; %let j = i; lag_&j = Lag&j.(x); end; run; 如何将循环变量I放入宏变量j,或者如何直接使用它来创建适当命名的变量和滞后函数?您将宏和数据步骤语法错误地混合在一起 您需要一个宏循环(%DO而不是DO)来生成数据步代码(即lag1-lag50),宏循环需要在宏中 %MACRO LAGLOOP ;

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

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

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

您将宏和数据步骤语法错误地混合在一起

您需要一个宏循环(
%DO
而不是
DO
)来生成数据步代码(即lag1-lag50),宏循环需要在宏中

%MACRO LAGLOOP ; data out ; set in ; %DO J = 1 %TO 50 ; lag_&J = lag&J(x) ; %END ; run ; %MEND ; %LAGLOOP ; %宏观滞后环; 数据输出; 产生 %DO J=1%至50; lag_uj=lag&J(x); %结束; 跑 %修补; %拉格洛普;
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;

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

如果您有SAS/ETS许可证,也可以查看proc EXPLAND。谢谢大家,我现在有不止一种方法来解决这个问题。这是一个完美的例子。好提示。我想我也会这么做,因为一个人通常需要在多个地方使用相同的解决方案@Joe您可能需要更改
lag.&iter=
滞后&\u iter=