在分析健保資料庫時,資料的合併是一個很重要的過程,但往往出錯的地方也是在此,今日要以數學「集合」的觀念來探討資料的合併,曾經有醫師抱怨這個部份很難懂,若以圖像的方式來解說,那麼就可一目瞭然了。
首先,利用 [程式一] 與 [程式二]寫入一組資料檔,第一組的檔名為aa,第二組的檔名為bb。利用INPUT指令放入一個變項 ID,"$"符號說明ID屬於文字變項,@@宣告即將輸入一列多筆的資料。
大家若稍微觀察一下將發現,檔案bb比aa多了17 、 18、 19 、 20 、 21、 22 、 23 、 24 、 25 等ID;檔案aa比bb多了26 、 27 、 28 、 29 、 30 、 31 、 32 、 33 、 34等ID,利用這兩個檔,我們來練習看看,如何進行資料的水平合併(Merge)。 [註: SET指令後方若放兩組以上的檔案,稱為垂直合併,新的資料筆數是所有檔案的筆數總合]
[程式三]是大家至為熟悉的程式,DATA指令後面指定新的檔案名稱為cc,透過MERGE(合併)指令將檔案aa與檔案bb合併起來。但兩個檔案的後面分別加了(in=a)、(in=b)的指令,它的目的即將檔案aa命名為集合a,將檔案bb命名為集合b,再以BY指令指定合併的關鍵字(KEY WORD)為ID,寫上RUN(執行)即已完成,此時兩檔的所有資料都被合併進來,如圖1所示。
[程式四]是[程式三]的加強說明,在by id之後,若加上if a|b;,即說明納入的ID是來自a集合或b集合,是聯集的概念。其意義與[程式三]是一致的,但我們一般不會畫蛇添足地多寫這麼一段。(見圖1) [ a|b的'|'為英文字 "or"之意 ]
[程式五]在by id之後,若加上if a=b;,即說明納入的ID是來自a集合與b集合的交集,即兩個檔個案中ID相同者才被挑出來。(見圖2)
[程式六]在by id之後,若加上if a=b then delete;,即說明納入的ID若同時來自a集合與b集合時要刪除,即挑出兩個檔案ID沒有重覆者,或刪除a集合與b集合的交集。(見圖3) if a=b then delete還可如何改寫呢? [答案: if (a|b)-(a=b); ]
其他組合,大家可以練習看看!(見圖4~7)
[程式一]
data aa;
input id $ @@;
cards;
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 26 27 28 29 30 31 32 33 34
;
run;
[程式二]
data bb;
input id $ @@;
cards;
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
;
run;
[程式三]
data cc;
merge aa(in=a) bb(in=b);
by id;
proc print;
run;
[程式四]
data cc;
merge aa(in=a) bb(in=b);
by id;
if a|b;
proc print;
run;
[程式五]
data cc;
merge aa(in=a) bb(in=b);
by id;
if a=b;
proc print;
run;
[程式六]
data cc;
merge aa(in=a) bb(in=b);
by id;
if a=b then delete;
proc print;
run;
留言列表