在我看來沒有必要使用您擁有的方法將日期和日期值轉換爲日期。
我使用INTNX在START和LISTEN變量中使用一年中的第一天將數據轉換回日期,並在相同變量中每週增加一次。這些日期可能並不完全符合您對數據集的要求,但它應該會導致類似的情況。
如果我正確地理解了你,下面應該做你想做的事。
DATA WANT2;
SET HAVE;
BY ID START;
RETAIN _START;
FORMAT _START DATE9.;
IF FIRST.ID THEN _START = START;
WEEKSINCESTART = INTCK("WEEK",_START,LISTEN);
RUN;
在這種情況下你的樣品進行排序,但如果你想通過語句的處理進行識別ID的價值,你需要先整理數據集的第一個實例。 retain語句將保存一個值,並通過使用by語句來指定保留變量中的值何時被更改。在這種情況下,我們希望在遇到ID的第一個實例時更改_START變量。我使用下劃線前綴,因爲如果需要,它可以更容易地刪除這些變量。直到下一個ID的實例纔會替換該值,這意味着它將成爲ID 1的後續觀察值等等。 INTCK功能測量第一和第二期間的間隔數(在本例中爲週數),在這種情況下,對於每個觀察,在_START中捕獲的每個ID的START開始的第一個實例和LISTEN之間。
最終的結果是:
ID START LISTEN _START WEEKSINCESTART
1 21AUG2011 18SEP2011 21AUG2011 4
1 29JAN2012 11DEC2011 21AUG2011 16
2 01FEB2009 08MAR2009 01FEB2009 5
2 31JAN2010 16MAY2010 01FEB2009 67
我希望這是有益的。
Regards, Scott