我尝试使用宏和数组来按组(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的输出:
答案 0 :(得分: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.