在分析健保資料庫時,資料的合併是一個很重要的過程,但往往出錯的地方也是在此,今日要以數學「集合」的觀念來探討資料的合併,曾經有醫師抱怨這個部份很難懂,若以圖像的方式來解說,那麼就可一目瞭然了。

首先,利用 [程式一] [程式二]寫入一組資料檔,第一組的檔名為aa第二組的檔名為bb。利用INPUT指令放入一個變項 ID"$"符號說明ID屬於文字變項,@@宣告即將輸入一列多筆的資料。


大家若稍微觀察一下將發現,檔案bbaa多了17 18 19 20 21 22 23 24 25 ID;檔案aabb多了26 27 28 29 30 31 32 33 34ID,利用這兩個檔,我們來練習看看,如何進行資料的水平合併(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;
data merge of SAS

arrow
arrow

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