SAS:如果数据集与另一个数据集中的观察值匹配,则从数据集中删除观察值

时间:2013-07-15 01:54:24

标签: sas

我只是在学习SAS。这是一个非常简单的问题 - 我可能会过度思考它。

我有一个名为people_info的数据集,其中一个变量是SocialSecurityNum。我有另一个名为invalid_ssn的表,其中包含一个变量:唯一且无效的SocialSecurityNum观察值。

我想有一个DATA步骤(或PROC SQL步骤),如果人({观察者)的invalid_people_infoSocialSecurityNum中的一个值匹配,则输出到invalid_ssn表。否则,它将输出回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

2 个答案:

答案 0 :(得分:5)

Hong Ooi显示的数据步骤很棒,但您也可以使用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所在的行(不是)。

答案 1 :(得分: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;
相关问题