→ xdreamer:謝謝 socery 的幫忙 10/13 08:47
※ 引述《xdreamer (going on)》之銘言:
: [軟體程式類別]:SAS
: [程式問題]: 同欄位相減
: [軟體熟悉度]: 低
: 新手(不到1個月)
: 低(1~3個月)
: 中(3個月到1年)
: 高(1年以上)
: [問題敘述]:
: 各位好
: 目前遇到了一個SAS的問題
: 由於是初學SAS沒有很久的學生
: 想請各位給予指導
: 例如有筆資料的型態如下:
: ID date bio
: 1 1995/ 5/3 43
: 1 1995/ 6/9 0
: 1 1996/ 3/7 50
: 1 1997/ 4/2 0
: 1 1997/ 4/7 49
: 2 1995/10/3 0
: 2 1995/10/9 20
: 2 1995/10/17 40
: 3 1997/ 4/2 10
: 3 1998/ 5/3 0
: 3 1999/ 6/9 70
: 3 1999/10/7 50
: 4 1994/11/13 60
: 4 1995/ 4/2 0
: 4 1996/ 8/7 49
: 4 1997/ 8/7 80
: 4 1999/ 8/9 42
: 資料已先依 ID 及 date 排序
: 現在想找出 bio=0 的最大日期為基準日
: 算出期後的日期差(天數)
: EX:
: ID date bio
: 1 1995/ 5/3 43
: 1 1995/ 6/9 0
: 1 1996/ 3/7 50
: 1 1997/ 4/2 0 <===以這天為基準,算出下一筆資料與這天的差(天數)
: 1 1997/ 4/7 49 差五天
: 2 1995/10/3 0 <===以這天為基準
: 2 1995/10/9 20 差六天
: 2 1995/10/17 40 差14天
: 所以希望的輸出形式為
: ID d_1_day d_2_day (只求與基準日期兩次的差而已)
: 1 5
: 2 6 14
: ...
: ...
: 以此類推
: 目前還沒學到同一欄位上下兩筆資料相減的指令(有這樣的指令嗎?)
: 還要以另一欄位的值,來判斷另一欄位的最大值,這就讓我想了五天之久,
: 一筆資料就在那邊無法動彈,想請各位給予指導,以便後續的分析進行,
: 非常謝謝大家。
: ----------------------------------------------------------------------------
data a0;set a;start=input(date,yymmdd10.);proc sort;by id start;run;
data a1;set a0;if bio=0;tn=1;proc sort;by id descending start;
proc sort nodupkey;by id;run;
data a2;merge a0(in=a)a1(in=b);by id start;if a=1;proc sort;by id start;run;
data a3;set a2;by id start;
if tn=1 then do;qn=tn-1;retain qn;date1=date;retain date1;end;
if first.id and tn=. then qn=.;
if tn=. and qn=0 then do;
tn=qn;bet=input(date,yymmdd10.)-input(date1,yymmdd10.);output;end;
drop qn;run;
proc transpose data=a3 out=a4 prefix=v;
by id;
var bet;
run;
data a4;set a4;keep id v1 v2;rename v1=d_1_day;rename v2=d_2_day;run;
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.167.137.35