【问题标题】:SAS Do loops: use loop variable inside the loop to create lagged variablesSAS Do 循环:在循环内使用循环变量来创建滞后变量
【发布时间】:2014-11-11 22:38:28
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您有 SAS/ETS 许可证,请查看 proc expand。
  • 谢谢大家,我现在有不止一种方法可以解决这个问题。

标签: sas sas-macro


【解决方案1】:

您错误地混合了宏和数据步语法...

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

%宏循环; 数据输出; 置入; %DO J = 1 %TO 50 ; lag_&J = 滞后&J(x) ; %结尾 ; 跑步 ; %修复; %LAGLOOP ;

【讨论】:

    【解决方案2】:

    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;
    

    这是宏循环的更模块化用法(并且更具可读性,假设您使用智能名称 - 上面没问题,如果您想非常清楚,您可以使用名称做更多事情,当然添加 cmets )。

    【讨论】:

    • 这是这种方法的完美示例。很好的提示。
    • 我想我也会这样做,因为通常需要在多个地方使用相同的解决方案。 @Joe 您可能需要将 lag_&iter. = 更改为 lag_&_iter. =
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多