我感覺到,全都回來了
quiz
首先給你這樣包含 unique subject id 和 各種 date 的數(shù)據(jù)集,如下,

要求你,先依據(jù)這 16 個字符型 date 變量創(chuàng)建對應(yīng)的數(shù)字型 date 變量,需為 date9. 格式;再生成一個新的 date 變量,該變量定義為:第一次出現(xiàn)的比前面的一個日期 >=15 天的日期,即若對于某條記錄,dtn_1002-dtn_1001>=15 ?那么 date 應(yīng)為 dtn_1002。
上 code,
data sv;
? ?set sv;
? ?array a_a(*) dt_1001-dt_1015 dt_1999;
? ?array a_b(*) dtn_1001-dtn_1015 dtn_1999;
? ?format dtn_1001-dtn_1015 dtn_1999 date9.;
? ?do i= 1 to dim(a_a,1);
? ? ? ?a_b(i)= input(a_a(i), yymmdd10.);
? ?end;
? ?do j= 1 to (dim(a_b,1)-1);
? ? ? ?if a_b(j+1)-a_b(j) >= 15 then do;
? ? ? ? ? ?date= put(a_b(j+1), yymmdd10.);
? ? ? ? ? ?leave;
? ? ? ?end;
? ?end;
? ?keep usubjid dtn_1001-dtn_1015 dtn_1999 date;
run;
proc print data= sv(obs= 2); run;
實現(xiàn)效果如下,

厘清思路
為什么要挑這個 quiz 來講?主要是看中了里面的 leave statement。
要重點說的,就是下面 do 循環(huán)中的生成新變量 date 的邏輯。quiz 要取第一個比前一次日期多 15 天的那個日期,取到以后就中止該 subject 后續(xù)的日期比較。這里我們用到了 leave,它的作用是:在滿足某些條件時徹底中止整體 do 循環(huán)(注意,并非當次循環(huán)),且不會返回 do statement。
我們看 print 出來的第一個 subject,它在 dtn_1011 時才滿足條件,因而,date 取到 dtn_1011 的日期,而不會再進行后續(xù)的日期比較。借助 leave,我們可以實現(xiàn)同一行數(shù)據(jù)相鄰列之間的相互比較。
