【问题标题】:SAS: Creating lag variables with a do macroSAS:使用 do 宏创建滞后变量
【发布时间】:2014-08-21 00:40:04
【问题描述】:

我正在尝试创建 4 个新的滞后变量,每个变量都添加一个额外的滞后。下面的代码只生成最终的滞后变量,即运行此代码后,有一个名为 lag_4 的新变量,但未创建 lag_1、lag_2 和 lag_3。谢谢

%macro makelags; 
%do i=1 %to 4;
data work.test1;
   set work.dataset;
   lag_&i = lag&i(id_number);
run;
%end;
%mend makelags;
%makelags;

【问题讨论】:

  • 你也可以在使用宏的时候开启option mprint;来帮助你调试。

标签: sas sas-macro


【解决方案1】:

您需要在数据步骤内循环,而不是在它之外。

如果你要循环:

data work.test1;
  set work.dataset;
  %do i = 1 %to 4;
    lag_&i. = lag&i.(id_number);
  %end;
run;

(整个数据步可以在宏中,或者只是 %do 循环)。

如果我需要一个宏,我会这样做(因为,比如说,滞后的数量会有所不同):

%macro lagme(num_lags=);
  %do _i = 1 %to &num_lags.;
     lag_&_i. = lag&_i.(id_number);
  %end;
%mend lagme;

data mydata;
  set olddata;
  %lagme(num_lags=4);
run;

【讨论】:

    【解决方案2】:

    您的代码将覆盖数据集 test1 4 次,仅保留上次 %do 迭代创建的版本。 尝试在数据步骤中移动%do 循环:

    data work.test1;
       set work.dataset;
       %do i=1 %to 4;
          lag_&i = lag&i(id_number);
       %end;
    run;
    

    【讨论】:

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