Re: [程式] 利用SAS進行排序以及RETAIN語法的應用

看板Statistics作者 (想像力)時間13年前 (2012/07/19 18:52), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《Justee (想像力)》之銘言: : ------------------------------------------------------------------------ : [軟體程式類別]: SAS : [程式問題]: 資料處理 : [軟體熟悉度]: 中(3個月到1年) : [問題敘述]: : 我有一組資料庫,因為其中部分資料的結束時間為missing data, : 所以想要使用最後一筆資料來取代。 這邊我自己發現一個問題,那就是當這兩個欄位都是時間欄位時, "?"反而會被排在最後。 : 病人 處方開始日期 處方結束日期 : A 20120630 20120712 : A 20120615 20120713 : A 20120703 . : A 20120629 . : B 20120712 20120713 : B 20120629 . : 問題一: : 使用PROC SORT依病人與處方結束日期排序後,missing data都會被SAS視為無限小, : 排序後落在最前面,可以命令將排序後的missing data排在最後嗎? 自問自答:可以,轉換為文字變項即可。 將missing data轉換為文字變項,排序的先後順序就會變到最後。 : 問題二: : 如何使用RETAIN statement來幫missing data補值呢? : 感謝各位大德的幫忙! 搜尋鐵大的文章+關鍵字missing可以找到類似的程式碼,以下是小弟的程式: PROC SORT DATA=Test; BY ACC EndDate; RUN; DATA Test; SET Test; RETAIN EndDate EndDate_New; IF EndDate^="?" THEN EndDate_New=EndDate; RUN; RUN; 如此一來會創造出新欄位EndDate_New,裡面就是我所想求的結果。 在需要依照帳號的部分,我創造了一個欄位並利用lag函數。 lag_ACC=lag(ACC) /*lag函數表示前一列中的ACC。*/ IF ACC=lag_ACC THEN EndDate=Enddate_New; 這樣就可以解決需要同一帳號的問題了! 折騰了一天,可以找到解法真是很開心!! 感謝鐵大,也希望之後遇到類似問題的人可以獲益~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.121.97 ※ 編輯: Justee 來自: 140.112.121.97 (07/25 11:08)
文章代碼(AID): #1G1-RI4P (Statistics)
文章代碼(AID): #1G1-RI4P (Statistics)