在許多分析步驟中,資料清檔檢查與變數的產生是基本動作,如何讓資料集(dataset)能乖乖的達成預想中的結構,需要技術人員與程式達到邏輯上的共鳴。技術人員按照程式邏輯的遊戲規則,下達準確的指令,產出預期的結構。本篇文章分享資料整理過程中常會使用到的小技巧之一:在多頻次的資料集中,如何讓同樣ID的數據們,按照時間序列往後挪

首先介紹,在SAS中如何單純的把資料往後挪(lag)

data a0 ; setaa ;

exam_date_lag1=lag1(exam_date) ; /** lag1: 即為lag一筆的意思 **/

format exam_date_lag1 yymmdd10. ;

run ;

1.jpg

 

此種方式為單純的lag一筆,但是通常我們想做的是在dataset中,同樣ID有多筆數據時,希望能按照ID去做lag時,下意識會將lagfirst.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 ;

 

2.jpg

 

lag指令包在if… then do…指令中時,會產生非預期的結果。在SAS的邏輯中,會先把first.ID取出後,直接對取出的first.IDlag。因此,ID=1的第一筆日期會lagID=2的第一筆,其它非first.ID的皆未做處理,故為遺漏值。

當希望資料能按照ID中的exam_datelag時,與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 ;

 

3.jpg

arrow
arrow
    全站熱搜

    晨晰部落格新站 發表在 痞客邦 留言(0) 人氣()