我想求每个name下面的前三个lag,下面是我的程序,但是结果出来总是不对,请帮我看看吧。
[code:2ucwy4ao]
data temp;
input name $1. ret;
datalines;
A 1
A 2
A 3
A 4
A 5
B 1
B 2
B 3
B 4
B 5
C 1
C 2
C 3
C 4
C 5
;
proc sort data=temp; by name; run;
data temp2;
set temp;
by name;
lag1=lag1(ret);lag2=lag2(ret);lag3=lag3(ret);
if first.name then do;
lag1=.;
lag2=.;
lag3=.;
end;
run;
[/code:2ucwy4ao]
输出为:
name ret lag1 lag2 lag3
A 1
A 2 1
A 3 2 1
A 4 3 2 1
A 5 4 3 2
B 1
B 2 1 5 4
B 3 2 1 5
B 4 3 2 1
B 5 4 3 2
C 1
C 2 1 5 4
C 3 2 1 5
C 4 3 2 1
C 5 4 3 2
也就是说对于B和C来说,lag出现了前一个name的。
我想要的结果是:
name ret lag1 lag2 lag3
A 1
A 2 1
A 3 2 1
A 4 3 2 1
A 5 4 3 2
B 1
B 2 1
B 3 2 1
B 4 3 2 1
B 5 4 3 2
C 1
C 2 1
C 3 2 1
C 4 3 2 1
C 5 4 3 2
datalines;
A 1
A 2
A 3
A 4
A 5
B 1
B 2
B 3
B 4
B 5
C 1
C 2
C 3
C 4
C 5
;
proc sort data=temp; by name; run;
data temp2;
set temp;
by name;
lag1=lag1(ret); name_lag1=lag1(name);
lag2=lag2(ret); name_lag2=lag2(name);
lag3=lag3(ret); name_lag3=lag3(name);
if name ne name_lag1 then lag1=.;
if name ne name_lag2 then lag2=.;
if name ne name_lag3 then lag3=.;
drop name_lag1-name_lag3;
run;[/code:2toi1s05]
[code:29ptfwap]data temp2;
set temp;
by name;
lag1=lag1(ret); lag2=lag2(ret); lag3=lag3(ret);
if (first.name) then n =0;
n+1;
array v{3} lag3 lag2 lag1;
if (n <=3) then
do i =1 to 4-n;
v[i] =.;
end;
drop n i;
run;[/code:29ptfwap]