在許多分析步驟中,資料清檔檢查與變數的產生是基本動作,如何讓資料集(dataset)能乖乖的達成預想中的結構,需要技術人員與程式達到邏輯上的共鳴。技術人員按照程式邏輯的遊戲規則,下達準確的指令,產出預期的結構。本篇文章分享資料整理過程中常會使用到的小技巧之一:在多頻次的資料集中,如何讓同樣ID的數據們,按照時間序列往後挪。
首先介紹,在SAS中如何單純的把資料往後挪(lag)
data a0 ; setaa ;
exam_date_lag1=lag1(exam_date) ; /** lag1: 即為lag一筆的意思 **/
format exam_date_lag1 yymmdd10. ;
run ;
此種方式為單純的lag一筆,但是通常我們想做的是在dataset中,同樣ID有多筆數據時,希望能按照ID去做lag時,下意識會將lag與first.ID做出邏輯上的錯誤結合,產出非預期的資料結構(範例如下):
procsortdata=aa ; by ID exam_date ; run ;
data a1 ; setaa ;
by ID ; if first.ID thendo ;
exam_date_lag1=lag1(exam_date) ;
end ;
format exam_date_lag1 yymmdd10. ; run ;
當lag指令包在if… then do…指令中時,會產生非預期的結果。在SAS的邏輯中,會先把first.ID取出後,直接對取出的first.ID做lag。因此,ID=1的第一筆日期會lag給ID=2的第一筆,其它非first.ID的皆未做處理,故為遺漏值。
當希望資料能按照ID中的exam_date做lag時,與first.ID正確結合使用的方式應如下,先將變項lag設定好,再將首筆ID做修正:
procsortdata=aa ; by ID exam_date ; run ;
data a2 ; setaa ;
exam_date_lag1=lag1(exam_date) ;
format exam_date_lag1 yymmdd10. ;
by ID ; if first.ID thendo ;
exam_date_lag1=. ;
end ;run ;
留言列表