2021年9月4日

〔SAS〕以PROC COMPARE比較資料檔

比較資料檔的工作,常見在問卷採用雙重資料鍵入(double data entry),比較兩次鍵入資料檔的差異性。

PROC COMPARE的語法不複雜,依據慣例先建立範例資料檔以供後續練習。

DATA Keyin_1;
INPUT id name$ sex$ age v1 v2 v3 v4 v5;
CARDS;
1 Allan M 43 1 1 2 3 4
2 Bobby M 32 2 2 3 4 1
3 Cindy F 19 4 4 4 2 1
4 Daisy F 25 4 3 2 3 3
5 Eric M 54 2 3 1 4 2
;
RUN;

DATA Keyin_2;
INPUT id name$ sex$ age v1 v2 v3 v4 v5;
CARDS;
3 Cindy F 19 3 4 4 2 1
1 Allan M 34 1 1 2 3 4
4 daisy M 25 4 3 2 3 2
2 Bobby M 32 2 2 3 4 1
5 Eric F 54 2 3 2 4 2
;
RUN;

假設Keyin_1與Keyin_2分別為兩次鍵入的資料檔,很不幸這兩個檔案,只有ID=2這一筆資料完全一致,其他筆資料均有不同之處。

PROC COMPARE BASE= Keyin_1 COMPARE= Keyin_2 NOVALUES;
RUN;

以最簡單的語法執行,其中BASE指令為基礎資料檔,COMPARE指令為比較的資料檔,NOVALUES指令能不顯示詳細數值的比較(之後再說明),結果如下圖

P1

結果顯示,這兩個檔案沒有任何一筆資料相同,剛剛不是有說至少ID=2相同,但結果卻不是如此,這是因為我們使用ID作為判斷依據時,必須使用ID指令。在使用ID指令前,要先將變項排序,程式與結果如下。

PROC SORT DATA = Keyin_1;
BY id;
RUN;
PROC SORT DATA = Keyin_2;
BY id;
RUN;

PROC COMPARE BASE= Keyin_1 COMPARE= Keyin_2 NOVALUES;
ID id;
RUN;

P2

當可以跑出正確的比較後,將NOVALUES指令刪除,重新在執行一次,如果不想看綜合報表可以是用NOSUMMARY指令將其關閉。

PROC COMPARE BASE= Keyin_1 COMPARE= Keyin_2 NOSUMMARY;
ID id;
RUN;

無使用NOVALUES下,可得詳細的比較結果,會依據「變項」將各ID比較不一致的結果呈現,如在sex變項中,同時有ID=4和ID=5兩筆資料不相同。

P3

如果想看同一個ID錯誤的狀況可以加上BY指令,即可依據ID呈現結果。

PROC COMPARE BASE= Keyin_1 COMPARE= Keyin_2 NOSUMMARY;
BY id;
ID id;
RUN;

P4

以PROC COMPARE能找出「鍵入不相同的資料」,稍微加工一下,就可以找出「鍵入完全相同的資料」,語法如下,這裡就不詳細說明,有興趣者可自行學習。

PROC COMPARE BASE= Keyin_1 COMPARE= Keyin_2 noprint OUT=Keyin_compare  outnoequal outbase outcomp outdif;
IDid;
RUN;


proc sql;
    create table Keyin_diff_id as
    select  distinct id
    from Keyin_compare
    order by id
    ;
quit;

proc sql;
    create table Keyin_same_id as
    select  a.*
    from Keyin_1 as a left join Keyin_diff_id as b on a.id=b.id
    group by b.id
    having count(b.id)=0
    order by id
    ;
quit;

最後在資料檔「Kyein_diff_id」可以看到不相同的ID,而在「Keyin_same_id」則可以看到鍵入相同的ID。

PROC COMPARE的應用其實不只可於資料鍵入使用,有時候我們在處理資料過程中,不確定能否產生相同或些許差異的資料檔,也可以透過PROC COMPARE來完成資料檔的比較。

沒有留言:

張貼留言