作者jackychou (叹这世间无奈好多)
看板Statistics
标题[程式] 请教一个SAS回圈的问题
时间Sat Dec 12 01:47:15 2009
------------------------------------------------------------------------
[软体程式类别]:
SAS
[程式问题]:
do until该怎麽放
[软体熟悉度]:
新手(不到1个月)
[问题叙述]:
由於处理论文资料的关系
我老板叫我自己去摸通SAS
然後把一些东西弄好给他看
不过我自己本身程式的能力很低
以下的程式码是我老板写好的部分
他丢给我原则上拿它来修改即可
我要做的事情是把程式里面 intck ('month', private.date1,a.date )= i
这部分从-60做到+60
老板好像说可以用macro写
不过我在网路上找教学还是不太懂MACRO是在干嘛
我自己想到是用DO UNTIL写
不过不太知道该怎麽放进这些叙述
如果我是想每个intck=i
都生成一个ZEROTRADE(i)
最後再用MERGE合并起来
有没有比较快的做法呢?
先谢谢耐心看到这边的各位
谢谢
[程式范例]:
主要问题部分:
proc sql;
create table ZEROTRADE as select
a.*, private.*
from a (rename=(permno= permno1)), private
where a.permno1=private.permno and intck ('month', private.date1,a.date )=0;
quit;
run;
-----------------------------------------------------------------------------
全部程式:
proc sql;
create table ZEROTRADE as select
a.*, private.*
from a (rename=(permno= permno1)), private
where a.permno1=private.permno and intck ('month', private.date1,a.date )=0;
quit;
run;
data ZEROTRADE;
set ZEROTRADE;
if VOL=. then delete;
if turnover=. then delete;
PROC SORT DATA= ZEROTRADE; BY ID PERMNO announce DATE;
run;
DATA NOTD ;
SET ZEROTRADE;
proc means data= NOTD noprint;
by ID;
var DATE;
output out=NOTDOUT sum=sumDATE;
run;
DATA NOTDOUT (KEEP=ID NOTD);
SET NOTDOUT (rename=(_FREQ_=NOTD));
PROC SORT DATA= NOTDOUT; BY ID ;
run;
DATA TURNOVER ;
SET ZEROTRADE;
proc means data=TURNOVER noprint;
by ID;
var turnover;
output out=TURNOVEROUT sum=sumturnover;
run;
DATA TURNOVEROUT (KEEP=ID ONE_MONTH_TURNOVER);
SET TURNOVEROUT (rename=(sumturnover=ONE_MONTH_TURNOVER));
PROC SORT DATA= TURNOVEROUT; BY ID ;
run;
DATA ZERO ;
SET ZEROTRADE;
IF VOL^=0 THEN DELETE;
PROC SORT DATA= ZERO; BY ID ;
run;
DATA ZERO ;
SET ZERO;
proc means data= ZERO noprint;
by ID;
var DATE;
output out=ZEROOUT sum=sumDATE;
run;
DATA ZEROOUT (KEEP=ID NOZERO);
SET ZEROOUT (rename=(_FREQ_=NOZERO));
PROC SORT DATA= ZEROOUT; BY ID ;
run;
DATA ZEROOUT1 ;
SET ZEROTRADE (KEEP=ID);
PROC SORT DATA= ZEROOUT1 noduplicate; BY ID ;
run;
DATA ZEROOUT2;
MERGE ZEROOUT1 (in=a) ZEROOUT (in=b) ; BY id ;
if a^=1 then delete;
PROC SORT DATA= ZEROOUT2; BY ID ;
run;
DATA ZEROOUT3;
set ZEROOUT2;
if NOZERO=. then NOZERO=0;
PROC SORT DATA= ZEROOUT3 noduplicate; BY ID ;
run;
data private (keep=id permno announce DATE1);
set private;
PROC SORT DATA=private; BY ID PERMNO DATE1;
run;
DATA lm;
MERGE private (in=a) NOTDOUT (in=b) ; BY id ;
if a^=1 then delete;
PROC SORT DATA= lm; BY ID ;
run;
DATA lm1;
MERGE lm (in=a) TURNOVEROUT (in=b) ; BY id ;
if a^=1 then delete;
PROC SORT DATA= lm1; BY ID ;
run;
DATA lm2;
MERGE lm1 (in=a) ZEROOUT3 (in=b) ; BY id ;
if a^=1 then delete;
PROC SORT DATA= lm2; BY ID ;
run;
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.42.33.108