本篇文章延續上一篇,分享資料整理過程中常會使用到的另個小技巧:在多頻次的資料集中,如何讓同樣ID的數據們,按照時間序列往前提。

SAS中如何運用lead達成把資料往前提的任務呢?

錯誤示範:仿照lag使用lag(ver)的方式,一樣直接使用lead(ver)嗎?

 

data a0 ; setaa ;

exam_date_lead1=lead1(exam_date) ;

format exam_date_lead1 yymmdd10. ;

run ;

 

如果仿照lag的方式修改指令(如上所示),會發現資料集無法順利產生,log會出現【ERROR: The function LEAD1 is unknown, or cannot be accessed.】。

SAS的世界跟我們想像的不太一樣,它有lag的函數(function)能讓資料集按時序遞延(lag),但是並沒有lead的函數能直接將資料集按時序往前補。因此,想達成將資料集按時序往前補的任務,必須借助外力支援。

正確示範:借助expand程序(procedure),結合lead將資料集按時序往前補

 

procsortdata=aa ; by ID exam_date; run ;

procexpand data=aa out=a1 ;

convertexam_date=exam_date_lead1 /transformout=(lead 1) ;

convertexam_date=exam_date_lead2 /transformout=(lead 2) ;

by ID ;run ;

 

expandSAS中處理時間資料的程序,第一步排序(sort)的動作,決定資料集的時序。Convert是將變項做轉換,「=」後面為轉換後的變項名稱,「/」後方接的是格式轉換的形式。(lead 1)為往前提1筆,(lead 2)為往前提2筆,以此類推之。「by ID」在此段語法中的用意,是希望往前遞補資料的方式,能依照不同ID做出區別。同樣ID中的資料才做遞補的動作,經過上述語法完成後的資料集,會出現TIME這個時序欄位。從下圖示可以看出,不同IDTIME時序會由ID的首筆歸零重新計算,因此資料遞補的任務僅在同樣ID中執行。

 

1.jpg

 

如果沒有「by ID」這個指令時,資料集的遞補會出現什麼狀況呢?

當指令中沒有下達「by ID」這項指令時,由下圖示可發現,TIME的時序變成不中斷的連續數值,資料的遞補是依照TIME的時序執行。因此,ID=2的第一筆被遞補至ID=1的最後一筆(如下圖中紅色箭頭所示)

 

2.jpg

 

延伸閱讀:http://support.sas.com/resources/papers/proceedings10/093-2010.pdf

關鍵字:SAS, procexpand, convert, lead

arrow
arrow
    全站熱搜

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