删除不属于SAS列表的观察值

时间:2014-09-07 20:27:13

标签: sas data-processing

我的第一个SAS数据集,ds1包含日期,公司和股价。我的第二个数据集ds2包含ds1中公司的子集。我想创建包含ds1中所有观察结果的ds3,前提是ds1中的公司也在ds2中。我尝试按如下方式执行此操作:

DATA ds3; set ds1; IF firm IN (d2); run;

上述内容无法按计划运行,因为ds3最终不包含任何观察结果。我认为问题是IF IN声明。我可以手动输入括号中的所有公司,而不是把d2放在那里,但这对我来说效率很低。

1 个答案:

答案 0 :(得分:1)

你有几种选择;正确的一个在很大程度上取决于你的特殊需求。

你实际做的是将两张桌子连在一起。因此,MERGE或SQL JOIN将是一个简单的解决方案。

data ds3;
  merge ds1(in=_ds1) ds2(in=_ds2 keep=firm);
  by firm;
  if _ds1 and _ds2;
run;

加入ds1和ds2,只保留ds2中的firm变量,并且只保留两者中的公司。 DS1和DS2都需要排序by firm;,而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相同的数据。