data d;
set a;
retain restkcd reperiod reincome pr 0 pstk '600894 ';/*第一个股票代码*/
drop restkcd reperiod reincome pr pstk ;
if pstk<>stkcd then do;/*不同股票进行初始化*/
pr=0;
pstk=stkcd;
end;
if income>=1 then do ;
if pr=0 then do;/*前一个符合*/
output ;
end ;
else if pr=1 do;
/*前一个不符合,结果保留*/
restkcd=stkcd;
reperiod=period;
reincome=income;
pr=2;
end ;
else if pr=2 do;/*前二个不符合,前一个符合,加载前一个*/
output;
stkcd=restkcd;
period=reperiod;
income=reincome;
output;
pr=0;
end ;
end;
else do;
pr=1;
end;
run;
----------------------------------------------
本人有段时间没有写BASE,手有些生疏,可能错误百出.现在也没有环境.无法进行测试,只能凭感觉写下了上面代码,那位有环境的仁兄帮助测试一下,在此感谢了.
问题的解决其实就是去掉不符合的记录和夹在两个不符合记录当中的符合记录,有点绕嘴.
这个论坛怎么没有处理空格呀,这看起来多别扭呀.作者: shiyiming 时间: 2003-9-29 15:40
/*我的思路基本和楼上的相同,实现功能,并没有考虑性能*/
data myset1;
input stkcd period yymmdd8. income;
datalines;
600894 20021231 1.0658
600895 19961231 2.698389
600895 19971231 3.556099
600895 19981231 8.842632
600895 19991231 4.895948
600897 19961231 0.122733
600897 19971231 4.770631
600897 19981231 1.82459
600897 19991231 3.911963
600897 20001231 3.56962
600897 20011231 3.952757
run;
proc sort data=myset1; by stkcd period; run;
data myset1;
length i 8;
retain period i;
period1=period;
set myset1;
by stkcd;
if not(first.stkcd=1 and last.stkcd=1);
if first.stkcd=1 then do; period1=period; i=1; end;
if year(period)-year(period1)>1 then i=i+1;
if income>1.0;
drop period1;
format period yymmdd10.;
run;
data myset1;
drop i;
set myset1;
by stkcd i;
if not(first.i=1 and last.i=1);
format period yymmdd10.;
run;作者: shiyiming 时间: 2003-9-29 17:42 标题: 多谢 多谢两位的帮忙!!
节日快乐!作者: shiyiming 时间: 2003-10-1 07:18
Very good.作者: shiyiming 时间: 2008-8-29 09:46 标题: Re: 关于sas对数据集的处理问题 通过划分年份计算更简单
data a1999 a2000 a2001;
set a ;
if substr(period,1,4)='1999' then output a1999;
if substr(period,1,4)='2000' then output a2000;
...........
................
;run;
proc sort data =a1999 ;
by stkcd ;
proc sort data =a2000 ;
by stkcd ;
proc datasets lib =work;
modify a1999;
rename period =year99;
rename income =income99;
modify a2000;
rename period =year00;
rename income =income00;
.........
......
run;
data all;
merge a1999 a2000 a2001 ;
by stkcd ;
all 里每条记录有不同年份的相关数据就好算了