「歸戶」是健保資料庫的資料處理過程中少不了的步驟,因為健保資料不是為學術目的而生成,而是為申請健保費用而存在的,因此資料庫中記載了每一次的就醫日期、就醫診斷、處置與費用等。若我們想知道每一個費用申報年有多少病人就醫?就必須透過「歸戶」的程序將一人多筆的資料轉為一人一筆,即可知每一個費用申報年有多少病人就醫。今天要介紹的是 first.var=1的語法。
[程式一] :以程式寫入1個資料檔aa,放入id(身份證號)、birthday(生日)、in_date(就醫日期)、icd9_cm1(國際疾病診斷碼),id與 icd9_cm1為文字型態的欄位;birthday,in_date為日期格式yymmdd10. 。format birthday in_date yymmdd10.;係指定birthday, in_date的SAS格式是yymmdd10.,這種型式指的是西元年-月-日,寬度共10個位元(byte)。
[程式二] :若大家有留意,會發現二件事:(一)資料檔aa中的第一筆資料非id為A01患者的第一筆就醫日期,(二)A01的第4筆出生日期與前3筆不同,若研究者想取每人的一筆資料,而且是每一個費用申報年的第一筆,資料就必須利用SORT指令先將id, birthday, in_date排序。為什麼要加入birthday?因為國人的戶政會出現不同的人擁有相同id的情況,因此認定資料是否為同一人的條件必須同時加入id與birthday。再加入in_date的目的,是為了讓入院日期由前排到後。接下來,利用DATA指令產生新的檔bb,且由SET指令讀取檔案aa。by id birthday; 這段程式說明以下的擷取第一筆的動作,要以id, birthday辨別哪幾筆是同一人的資料。 if (first.id=1 & first.birthday=1) | (first.id=0 & first.birthday=1);這段程式是歸戶的主要動作,簡略地表達,可以將左式改為IF A | B; A=(first.id=1 & first.birthday=1),意即先取每人的id與birthday的第一筆;B=(first.id=0 & first.birthday=1),即在相同的id中,若id不是第一筆,但birthday第一次出現,要取出來。如此即完成擷取每人的第一筆資料的歸戶動作,檔案aa中包含3個人的資料,您的程式寫對了嗎?(見[結果])
大家練習看看,若要依每一個就醫年度去擷取每人的第一筆,歸戶程式該如何寫?
[程式一];
data aa;
input id $ birthday yymmdd10. in_date yymmdd10. icd9_cm1 $;
format birthday in_date yymmdd10.;
cards;
A01 1956-02-032006-10-12 493
A01 1956-02-032006-03-10 25090
A01 1956-02-032007-01-23 4870
A01 1973-08-052007-01-31 4910
B01 1977-11-302008-02-15 5990
B01 1977-11-302008-03-24 7805
;
proc print;
run;
[程式二];
proc sort data=aa;
by id birthday in_date;
data bb;
set aa;
by id birthday;
if (first.id=1 & first.birthday=1) | (first.id=0 & first.birthday=1);
proc print;
run;
[結果]
Obs id birthday in_date icd9_cm1
1 A01 1956-02-03 2006-03-10 25090
2 A01 1973-08-05 2007-01-31 4910
3 B01 1977-11-30 2008-02-15 5990