2013-07-15 116 views
2

我剛剛學習SAS。這是一個非常簡單的問題 - 我可能會推翻它。SAS:如果數據集中的觀察值與另一個數據集中的觀察值匹配,則刪除觀察值

我有一個名爲people_info的數據集,其中一個變量是SocialSecurityNum。我有另一個表叫invalid_ssn與一個單一的變量:唯一和無效SocialSecurityNum意見。

如果人(觀察)的SocialSecurityNuminvalid_ssn表中的某個值匹配,我想要有一個DATA步驟(或PROC SQL步驟),輸出到invalid_people_info。否則,它將輸出回people_info

這樣做的最好方法是什麼?

編輯:更多信息,澄清...

people_info看起來是這樣的:

name  SocialSecurityNum 
joe  123 
john  456 
mary  876 
bob  657 

invalid_ssn看起來是這樣的:

SocialSecurityNum 
456 
876 

我想要的是people_info改變(就地),看起來像這樣:

name  SocialSecurityNum 
joe  123 
bob  657 

和一個新的表,叫invalid_people_info看起來像這樣:

name  SocialSecurityNum 
john  456 
mary  876 

回答

3

您的要求是不明確的。您是否想要從people_info中刪除所有無效的SSN並將它們放入新數據集中?如果是這樣,這應該工作。您必須首先通過SocialSecurityNum對數據集進行排序。

data people_info invalid_people_info; 
    merge people_info (in=a) invalid_ssn (in=b); 
    by SocialSecurityNum; 
    if b then output invalid_people_info; 
    else output people_info; 
run; 
+0

謝謝,我添加了更多信息使其更清晰。 – Clay

+0

好的,我給出的代碼應該這樣做。 –

+0

謝謝。我認爲我被認爲是「參考」表的合併。 – Clay

5

由香港大井顯示的數據步驟是偉大的,但也尤歐可以這樣用PROC SQL,而不需要先和排序也沒有真正執行一個完全合併。

proc sql noprint; 

    create table invalid_people_info as 
    select * 
    from people_info 
    where socialsecuritynum in (select distinct socialsecuritynum from invalid_ssn) 
    ; 

    create table people_info as 
    select * 
    from people_info 
    where socialsecuritynum not in (select distinct socialsecuritynum from invalid_ssn) 
    ; 

quit; 

這只是簡單地選擇所有行中的ssn是(不)在不同的無效ssn的列表中。

+0

如果'鑰匙'由多個變量表示,例如'socialsecuritynum','birthdate'和'nationality'? – Giuseppe

+0

連接它們 – scott

+0

Mmh可以工作,但它看起來效率不高或強大....想象一下,使用數字標識符,您必須採取一些技巧,如 C = A * 1000 + B,如果A是三位數標識符 - 這種東西似乎容易出現人爲錯誤。而對於字符串,它會消耗大量時間。我希望能夠像「哪裏一個&B&C不在......」(這是錯誤的btw)。任何想法? – Giuseppe