SAS中文论坛

标题: 关于sas对数据集的处理问题 [打印本页]

作者: shiyiming    时间: 2003-9-29 00:04
标题: 关于sas对数据集的处理问题
我现在有一个数据集名为myset1,有三个变量,stkcd表示股票代码,period表示年度,income 表示利润 其中部分数据如下:
                       stkcd        period       income      
                       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
现在我要找出存在  相邻的两年利润都大于1.0的股票代码和年度。请教该如何编制程序实现。
作者: shiyiming    时间: 2003-9-29 11:11
data a;
input stkcd period income;
cards;
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=a;
        by stkcd period;

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 里每条记录有不同年份的相关数据就好算了

我们处理财务报表时计算财务比率都是这样处理的




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2