SAS:如果观测值与另一个数据集中的观测值匹配,则从数据集中删除观测值
我只是在学习SAS。这是一个非常简单的问题——我可能想得太多了 我有一个名为SAS:如果观测值与另一个数据集中的观测值匹配,则从数据集中删除观测值,sas,Sas,我只是在学习SAS。这是一个非常简单的问题——我可能想得太多了 我有一个名为people\u info的数据集,其中一个变量是SocialSecurityNum。我有另一个名为invalid\u ssn的表,其中有一个变量:unique和invalidSocialSecurityNumobservations 如果人员(观察)的SocialSecurityNum与invalid\u ssn表中的一个值匹配,我希望有一个数据步骤(或PROC SQL步骤)输出到invalid\u people\u
people\u info
的数据集,其中一个变量是SocialSecurityNum
。我有另一个名为invalid\u ssn
的表,其中有一个变量:unique和invalidSocialSecurityNum
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处理子查询的方式,这可能需要与连接一样长的时间。