SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1724|回复: 5
打印 上一主题 下一主题

关于sas对数据集的处理问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2003-9-29 00:04:49 | 只看该作者

关于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的股票代码和年度。请教该如何编制程序实现。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2003-9-29 11:11:29 | 只看该作者
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,手有些生疏,可能错误百出.现在也没有环境.无法进行测试,只能凭感觉写下了上面代码,那位有环境的仁兄帮助测试一下,在此感谢了.
问题的解决其实就是去掉不符合的记录和夹在两个不符合记录当中的符合记录,有点绕嘴.
这个论坛怎么没有处理空格呀,这看起来多别扭呀.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2003-9-29 15:40:59 | 只看该作者
/*我的思路基本和楼上的相同,实现功能,并没有考虑性能*/
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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2003-9-29 17:42:05 | 只看该作者

多谢

多谢两位的帮忙!!
节日快乐!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2003-10-1 07:18:31 | 只看该作者
Very good.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2008-8-29 09:46:06 | 只看该作者

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

我们处理财务报表时计算财务比率都是这样处理的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 23:41 , Processed in 0.068575 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表