在生物醫學研究中 資料庫習慣以一筆資料為一個人來呈現
即一列觀察值代表一位研究對象的資料
但有時 並不能如我們所願 最典型的例子即健保資料庫
一筆資料可能代表一次住院 一次門診 一次申報 或一筆醫令等
此時 需要將資料進行「歸戶」 或稱「歸人」
意即 當取得的原始資料單位並非進行研究分析所需要的單位
而將「原始資料單位」轉化為「分析資料單位 」的過程

不需累計的歸戶:
以健保資料庫中的DD檔為例:找出每人第一次住院日期

「方法一」利用PROC SORT先將資料庫以身份證字號、出生日期及住院日期排序
再PROC SORT一次 並新增NODUPKEY option 而BY statement 只放身份證字號及出生日期
此時同身份證字號與出生日期的研究對象 只會保留第一筆 也就會是每人的第一次住院日期
若第二次PROC SORT的BY statement放了身份證字號、出生日期及住院日期
則不會刪除任何觀察值 因每筆的此三個變項皆不同 就沒做到歸戶的動作
而NODUPKEY是會刪除BY statement中變項相同的觀察值
另一種NODUP 則是會刪除資料庫中 所有變項皆相同的觀察值

proc sort data=dd;
    by id id_birthday in_date;

proc sort data=dd nodupkey;
    by id id_birthday;
run;

「方法二」同樣先將資料庫以身份證字號、出生日期及住院日期排序
接著DATA step中的BY statement 只放身份證字號及出生日期
接著利用FIRST. function 抓出同身份證字號與出生日期的第一筆資料 也就會是每人的第一次住院日期
那想抓每人最後一次的住院資料呢? 只要將FIRTST. 改為LAST. 就可以囉

proc sort data=dd;
    by id id_birthday in_date;

data a;
set dd;
    by id id_birthday;
    if first.id_birthday;
run;

計算次數的歸戶:
以健保資料庫中的CD檔為例:計算每人門診總次數

「方法一」與上面不需累計的歸戶之方法二用到相同的概念
當遇到同身份證字號與出生日期的研究對象時 設定第一筆觀察值的count為0
碰到第二筆時 讓count加1 第三筆時 count會是3 即完成每人門診次數的編碼
最後使用IF LAST. 讓資料庫只留下每人的最後一筆觀察值 此時count會是每人的門診總次教

proc sort data=cd;
    by id id_birthday func_date;

data x;
set cd;
    by id id_birthday;
    if first.id_birthday then count=0;
    retain count;
    count+1;
    if last.id_birthday;
run;

「方法二」是運用列聯表的概念 計算資料庫中同身份證字號與出生日期的觀察值共有幾筆
並將此計算結果 利用在TABLE statement後 加入OUT option輸出到新的資料庫

proc freq data=cd noprint;
    table id*id_birthday/ out=y;
run;

「方法三」同樣是計算資料庫中同身份證字號與出生日期的觀察值 不同的門診日期共有幾筆
但是 是使用PROC SQL語法

proc sql noprint;
create table z as 
    select id, id_birthday, count(distinct func_date) as count
    from cd
    group by id, id_birthday;
quit;

累計數字的歸戶(重直加總): 
同樣以健保資料庫的CD檔為例:計算每人門診藥品總費用

「方法一」與上面計算次數的歸戶之方法一的概念相同
當遇到同身份證字號與出生日期的研究對象時 設定第一筆觀察值的total為0
碰到第二筆時 讓total等於第一筆的total加上第二筆的drug_amt
第三筆時 total會是第二筆的total加上第三筆的drug_amt 即完成每人門診藥費的加總
最後使用IF LAST. 讓資料庫只留下每人的最後一筆觀察值 此時total會是每人的門診藥品總費用

proc sort data=cd;
    by id id_birthday func_date;

data xx;
set cd;
    by id id_birthday;
    if first.id_birthday then total=0;
    retain total;
    total+drug_amt;
    if last.id_birthday;
run;

「方法二」使用PROC MEANS語法計算同身份證字號與出生日期的觀察值 其門診藥費的加總
並將計算結果 使用OUTPUT statement輸出到新資料庫 加總後的變項命名為total

proc means data=cd sum noprint nway;
    class id id_birthday;
    var drug_amt;
    output out=yy sum=total;
run;

「方法三」同樣是計算同身份證字號與出生日期的觀察查 其門診藥費的加總是多少
但是 是使用PROC SQL語法

proc sql noprint;
create table zz as
    select id, id_birthday, sum(drug_amt) as total
    from cd
    group by id, id_birthday;
quit;

 

延伸閱讀:

【SAS】使用ODS整理分析結果
【SAS】使用macro重複執行特定程序
【SAS】在macro中自動累加檔案
【SAS】將檔案內容設為巨集變數

 

arrow
arrow

    rover1023 發表在 痞客邦 留言(3) 人氣()