健保資料庫中的國際疾病分類碼(ICD9-CM)在資料分析中,可以用來定義感興趣的疾病,在『門診處方及治療明細檔』有3個欄位記錄國際疾病分類碼;『住院醫療費用清單明細檔』則有5個欄位。究竟要如何透過國際疾病分類碼定義疾病?一般的作法是請益臨床的醫師或其他專業人員,以瞭解一個疾病是透過幾個分類號(ICD9_CM)構成,例如糖尿病是ICD9-CM3碼為250的分類號。但病歷登錄時,有時會登錄到4位碼(例如2500為未提及併發症之糖尿病),有時會登錄到5(例如25003為第一型糖尿病,未提及併發症,無法控制)。若不需要分類到4位或是5位碼,只是以3位碼250代表所有的糖尿病,程式將如何撰寫?今日將介紹子字串函數:SUBSTR( VARIABLE, POSITION, LENGTH)

[程式一] 建立3個患者的資料,以INPUT指令讀入ID (身份證號)ICD9_CM1~ICD9_CM3(國際疾病分類號一至國際疾病分類碼三),資料型態皆為文字型($)


[程式二] PROC CONTENTS 指令查看資料檔AA的資料結構,在CONTENTS後面加上POSITION,是為了以資料建立時的欄位順序呈現資料結構,否則會以欄位名稱的字母作排序。在輸出的結果中可看到每一個欄位的順序, 欄位名稱,以及資料型態,透過這支程式可以快速建立譯碼簿(CODE BOOK)

[程式三] 透過IF指令擷取ICD9_CM中,前3碼為250(糖尿病)以及493(氣喘)的患者,因為『門診處方及治療明細檔』有3個欄位記錄國際疾病分類碼,因此每一個欄位都要檢查看看,是否有前3碼為250以及493的代號。因為文字串的資料都是左靠,因此可以由每一個ICD9_CM的最左邊的第一個字元,向右取3個字元,如此即將前3碼為250(糖尿病)493(氣喘)的患者取出。substr(ICD9_CM1,1,3)係指被擷取部份子字串的欄位是ICD9_CM1,從第1個欄位開始擷取,擷取的寬度是3個字元。此外程式中以IN 代替等號"=",且將要定義的疾病碼放在括號 ( )中,如此,可在括號( )中放2個以上的代碼,使程式更為精簡。結果,只有2個患者有250493的代碼(參見[結果])

是不是很簡單呢?


[程式一];
data aa;
input id $ (icd9_cm1- icd9_cm3) ($);
cards;
A01 250 4930 4279
A02 7851 25041 585
A03 532 5959 4130
;
proc print;
run;

[程式二];
proc contents position data=aa;*查看資料內容 ;
run;


* Variables in Creation Order

# Variable Type Len

1 id Char 8
2 icd9_cm1 Char 8
3 icd9_cm2 Char 8
4 icd9_cm3 Char 8
;

[程式三];
data bb;
set aa;
if substr(ICD9_CM1,1,3) in ('250','493') | substr(ICD9_CM2,1,3) in ('250','493') | 
substr(ICD9_CM3,1,3) in ('250','493');
proc print;
run;

 

[結果]

SUBSTR  

 

arrow
arrow

    estat 發表在 痞客邦 留言(0) 人氣()