作者imaltar (..)
站内Statistics
标题Re: [程式] SAS资料计算
时间Fri Jun 25 21:46:16 2010
data survial;input date date10. response;
format date date10. ;
cards;
09AUG07 1
23AUG07 1
06SEP07 2
20SEP07 2
05OCT07 1
16OCT07 1
30OCT07 2
29NOV07 1
01JAN08 2
10JAN08 2
19JAN08 2
30JAN08 2
10JUN08 1
;
run;
在巨集中,indate是放原始资料,本例就是survial
time就是日期变数,本例是date
var就是判断的变数,本例是response
value2是欲观察练续情形的值,本例是2
value1就是另外的值,本例是1
out就是最终的资料,本例是survial5
我除了试你的例子,还有再多加一些变化
目前是都可以正确跑出结果,你可以试试看你的data执行有没有错
应该还有更有效率的作法,只是目前还没想到~~~
%macro search(indata=,time=,var=,value1=,value2=,out=);
proc sort data=&indata. out=survial1;by descending &time.;run;
data survial1;set survial1;r_right=lag(&var.);
proc sort data=survial1;by &time.;run;
data survial2;set &indata.;r_left=lag(&var.);
data survial2;merge survial1 survial2;run;
data survial3;set survial2(where=(&var.=&value2.));
data survial4;set survial3(where=( r_right ne r_left));
if r_right=. then r_right=&value1.;if r_left=. then r_left=&value2.;n+1; run;
proc sql noprint;select max(n) into:m_n from survial4;
data _null_;set survial4(where=(n=1));
if r_right=&value1. then call symput('start',2);
if r_right=&value2. then call symput('start',1);run;
data s;set _null_;
%do i=&start. %to &m_n. %by 2;
data s1_&i.;set survial4;if n=&i.;
data s2_&i.;set survial4;if n=%eval(&i.+1);
data s&i.;set s1_&i. s2_&i.;
data _null_;set s&i.(where=(r_left=&value1.));call symput('date_start',&time.);
data _null_;set s&i.(where=(r_left=&value2.));call symput('date_end',&time.);
data s&i.;set s&i.;days=intck('day',&date_start.,&date_end.)+1;call
symput('days',days);
data s&i.;merge survial3 s&i.;by &time.;if r_left=&value1. &
r_right=&value1. then delete;
if &date_start. <= &time.<= &date_end.;if days=. then days=&days.; run;
data s;set s s&i.;run;
%end;
proc sort data=s;by &time.;
data &out.;merge &indata.(in=a) s(keep=&time. days);by &time.;if a;run;
%mend;
%search(indata=survial,time=date,var=response,value1=1,value2=2,out=survial5);
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.193.72.239
※ 编辑: imaltar 来自: 123.193.72.239 (06/25 21:48)
※ 编辑: imaltar 来自: 123.193.72.239 (06/25 22:07)
※ 编辑: imaltar 来自: 123.193.72.239 (06/25 22:17)
1F:→ imaltar:不过日期有重复的话 就可能会有错 如果有重复日期 06/25 22:18
2F:→ imaltar:那就要再想一下 06/25 22:19
※ 编辑: imaltar 来自: 123.193.72.239 (06/25 22:44)
※ 编辑: imaltar 来自: 123.193.72.239 (06/25 23:11)
3F:→ imaltar:真糟 一直改 不知道原PO有没有看到>< 06/25 23:11
4F:推 tew:不要用巨集,这个可以简单处理 06/26 02:43
5F:→ imaltar:更简单的方式可能是不要用回圈 我用具集的用意是像 06/26 09:01
6F:→ imaltar:indata我的例子是survival 原po的data名称也许不一样 06/26 09:02
7F:→ imaltar:我的time(日期名称)是令为date 但原po的资料变数名会不同 06/26 09:03
8F:→ imaltar:所以巨集的用意是让使用者可以根据他原始资料 资料名称 06/26 09:03
9F:→ imaltar:变数名称 去弹性输入 而不用当资料不同时 还要一个个去改 06/26 09:04
10F:→ imaltar:当然能回圈处理会比较省时 所以我说写的不够精简就是在此 06/26 09:06
11F:→ imaltar:说错 是回圈比较费时 06/26 09:07
12F:→ ASD332:巨集跟回圈... 应该是不一样的东西吧 @@ 06/26 17:20
13F:→ imaltar:我没说一样阿.... 06/26 21:12
14F:→ ASD332:抱歉 眼残漏看了 06/26 22:05