t******o 发帖数: 70 | 1 data test;
input id $ yr asset netp;
datalines;
111 2012 23 11
111 2010 25 10
111 2009 39 20
111 2011 29 12
123 2008 9 4
123 2009 8 3
123 2010 7 2
;
run;
想要的结果是这样的:
id yr asset netp asset_py netp_py
111 2012 23 11 25 10
111 2011 25 10 39 20
111 2010 39 20 . .
111 2008 29 12 . .
123 2010 9 4 8 3
123 2009 8 3 7 2
123 2008 7 2 . .
解释:新产生的两列是对应previous year的值。
请教应该怎么实现,非常感谢! |
j******o 发帖数: 127 | 2 Try expand procedure.
proc expand data=test out=obtain(drop=time);
by id;
convert asset=asset_py / transformout=(lead 1);
convert netp=netp_py / transformout=(lead 1);
run; |
t******o 发帖数: 70 | 3 Worked well. Thanks!
I also found a less efficient solution.
proc sort data = test;
by id yr;
run;
data test1;
set test;
asset_py = lag(asset);
netp_py = lag(netp);
if first.id then do;
asset_py = . ;
netp_py = .;
end;
run;
【在 j******o 的大作中提到】 : Try expand procedure. : proc expand data=test out=obtain(drop=time); : by id; : convert asset=asset_py / transformout=(lead 1); : convert netp=netp_py / transformout=(lead 1); : run;
|
l****u 发帖数: 529 | 4 proc sql;
create table new as
select a.*, b.asset as asset_py, b.netp as netp_py
from test a left join test b
on a.id=b.id and b.yr-a.yr=1;
quit;
|
x*******4 发帖数: 39 | 5 你这个显然有错 你要用FIRST.ID 你set的时候就要By id。 而且你这个也达不到你开
头要的结果。。。
【在 t******o 的大作中提到】 : Worked well. Thanks! : I also found a less efficient solution. : proc sort data = test; : by id yr; : run; : data test1; : set test; : asset_py = lag(asset); : netp_py = lag(netp); : if first.id then do;
|
t******o 发帖数: 70 | 6 好像是的,忽略了yr不连续的情况 :)
luanyu兄的方法没问题。
【在 x*******4 的大作中提到】 : 你这个显然有错 你要用FIRST.ID 你set的时候就要By id。 而且你这个也达不到你开 : 头要的结果。。。
|