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

SAS:如果观测值与另一个数据集中的观测值匹配,则从数据集中删除观测值,sas,Sas,我只是在学习SAS。这是一个非常简单的问题——我可能想得太多了 我有一个名为people\u info的数据集,其中一个变量是SocialSecurityNum。我有另一个名为invalid\u ssn的表,其中有一个变量:unique和invalidSocialSecurityNumobservations 如果人员(观察)的SocialSecurityNum与invalid\u ssn表中的一个值匹配,我希望有一个数据步骤(或PROC SQL步骤)输出到invalid\u people\u

我只是在学习SAS。这是一个非常简单的问题——我可能想得太多了

我有一个名为
people\u info
的数据集,其中一个变量是
SocialSecurityNum
。我有另一个名为
invalid\u ssn
的表,其中有一个变量:unique和invalid
SocialSecurityNum
observations

如果人员(观察)的
SocialSecurityNum
invalid\u ssn
表中的一个值匹配,我希望有一个数据步骤(或PROC SQL步骤)输出到
invalid\u people\u info
。否则,它将输出回
people\u info

最好的方法是什么

编辑:更多信息,以澄清…

people\u info
如下所示:

name     SocialSecurityNum
joe      123
john     456
mary     876
bob      657
SocialSecurityNum
456
876
name     SocialSecurityNum
joe      123
bob      657
name     SocialSecurityNum
john     456
mary     876
无效\u ssn
如下所示:

name     SocialSecurityNum
joe      123
john     456
mary     876
bob      657
SocialSecurityNum
456
876
name     SocialSecurityNum
joe      123
bob      657
name     SocialSecurityNum
john     456
mary     876
我想要的是
people\u info
更改(就地)并如下所示:

name     SocialSecurityNum
joe      123
john     456
mary     876
bob      657
SocialSecurityNum
456
876
name     SocialSecurityNum
joe      123
bob      657
name     SocialSecurityNum
john     456
mary     876
还有一个新表,名为
invalid\u people\u info
,如下所示:

name     SocialSecurityNum
joe      123
john     456
mary     876
bob      657
SocialSecurityNum
456
876
name     SocialSecurityNum
joe      123
bob      657
name     SocialSecurityNum
john     456
mary     876

你的要求不清楚。是否要从
people\u info
中删除所有无效的SSN并将其放入新的数据集中?如果是这样,这应该是可行的。您必须首先按SocialSecurity对数据集进行排序

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;

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的不同列表中的所有行

谢谢。我想我被挂断了与“参考”表的合并。如果“键”由多个变量表示,例如“SocialSecurity”、“birthdate”,还有“国籍”?嗯,这会起作用,但它看起来不是很有效/健壮……想象一下,对于数字标识符,如果A是三位数的标识符,你必须使用一些技巧,比如C=A*1000+B,而这类东西似乎容易出现人为错误。而使用字符串则需要花费大量时间。我希望是“a&b&c不在……的地方”(顺便说一句,这是错误的)。有什么想法吗?您可以在每个where语句之间加一个and和一个单独的子查询,根据sas处理子查询的方式,这可能需要与连接一样长的时间。