1

我尝试使用宏和数组按组(id)滞后一堆变量。我的步骤是: 1. 滞后所有变量(组无关紧要) 2. 将错误滞后的单元格替换为.

但我发现我的代码有问题,感谢任何建议。

这是数据:

data old;
  input id sale capx profit;
datalines;
1   11  111 1111
1   12  112 1112
1   13  113 1113
1   14  114 1114
1   15  115 1115
1   16  116 1116
1   17  117 1117
2   21  221 2221
2   22  222 2222
2   23  223 2223
3   31  331 3331
3   32  332 3332
3   33  333 3333
3   34  334 3334
4   41  441 4441
4   42  442 4442
4   43  443 4443
4   44  444 4444
4   45  445 4445
4   46  446 4446
;
run;

代码:

 data new;
 set old;
 run;

%macro lag_var(dataset, lag);
  proc sort data=&dataset;by id;
  data &dataset;
    set &dataset;
    by id;
    array vs(3) sale capx profit;
    %do j=1 %to 3;
            %do i=1 %to &lag;
            lag&j&i=lag&i(vs(&j));

            if first.id then 
            do;
            count=1;
            lag&j&i=.;
            end;
            count+1;
            if (not first.id and count<=&i) then
            do;
            lag&j&i=.;
            count+1;
            end;
            %end;
    %end;
  run;
%mend lag_var;

%lag_var(new,5)

电流输出(错误): 在此处输入图像描述

我的预期结果: 在此处输入图像描述

DomPazz 的输出: 在此处输入图像描述

4

1 回答 1

2

那些后来的组保持他们的价值的原因是你过度增加了count

我认为这可以满足您的需求:

%macro lag_var(dataset, lag);
  proc sort data=&dataset;by id;
  data &dataset;
    set &dataset;
    by id;
    array vs(3) sale capx profit;
    %do j=1 %to 3;
            %do i=1 %to &lag;
            lag&j&i=lag&i(vs(&j));
            %end;
    %end;

    if first.id then do;
       count=0;
       %do j=1 %to 3;
          %do i=1 %to &lag;
             lag&j&i=.;
          %end;
       %end;
    end;

    count+1;

    %do j=1 %to 3;
       %do i=1 %to &lag;

          if (not first.id and count<=&i) then do;
               lag&j&i=.;
            /*count+1;*/
          end;
       %end;
    %end;
  run;
%mend lag_var;

编辑:将计数的初始化从 1 更改为 0。

于 2013-10-13T03:00:22.163 回答