删除不在SAS列表中的观察结果

删除不在SAS列表中的观察结果,sas,data-processing,Sas,Data Processing,我的第一个SAS数据集ds1包含日期、公司和股价。我的第二个数据集ds2包含ds1中公司的子集。我想创建包含ds1中所有观察结果的ds3,前提是ds1中的公司也在ds2中。我试着这样做: 数据ds3; 设置ds1; 若在(d2)中确定; 运行 由于ds3最终不包含任何观察结果,因此上述操作无法按计划进行。我认为问题在于IF IN语句。我可以手动键入括号中的所有公司,而不是将d2放在括号中,但这对我来说效率很低。您在这里有几个选项;正确的答案很大程度上取决于你的特殊需要 实际上,您所做的是将两个表

我的第一个SAS数据集ds1包含日期、公司和股价。我的第二个数据集ds2包含ds1中公司的子集。我想创建包含ds1中所有观察结果的ds3,前提是ds1中的公司也在ds2中。我试着这样做:

数据ds3;
设置ds1;
若在(d2)中确定;
运行


由于ds3最终不包含任何观察结果,因此上述操作无法按计划进行。我认为问题在于
IF IN
语句。我可以手动键入括号中的所有公司,而不是将d2放在括号中,但这对我来说效率很低。

您在这里有几个选项;正确的答案很大程度上取决于你的特殊需要

实际上,您所做的是将两个表连接在一起。因此,合并或SQL连接将是一个简单的解决方案

data ds3;
  merge ds1(in=_ds1) ds2(in=_ds2 keep=firm);
  by firm;
  if _ds1 and _ds2;
run;
它连接ds1和ds2,只保留ds2中的
firm
变量,并只保留两者中的公司。DS1和DS2都需要按公司排序
,并且DS2应该只有唯一的值
firm
-没有重复项

SQL也非常简单

proc sql;
  create table ds3 as
    select * from ds1 where exists (
      select 1 from ds2 
         where ds1.firm=ds2.firm
    );
quit;
这有点接近您的术语(毫不奇怪,对于许多简单的查询,SQL试图接近自然语言)。这不需要排序或唯一性,尽管这不会特别快

您还可以以某种格式存储DS2公司,或者使用哈希表允许您在打开DS1的同时打开DS2。还可以使用键控set语句。所有这些实现都稍微复杂一些,但通常更快,因为它们不需要排序,也不需要像SQL那样重复引用相同的数据