我的第一个SAS数据集,ds1包含日期,公司和股价。我的第二个数据集ds2包含ds1中公司的子集。我想创建包含ds1中所有观察结果的ds3,前提是ds1中的公司也在ds2中。我尝试按如下方式执行此操作:
DATA ds3;
set ds1;
IF firm IN (d2);
run;
上述内容无法按计划运行,因为ds3最终不包含任何观察结果。我认为问题是IF IN
声明。我可以手动输入括号中的所有公司,而不是把d2放在那里,但这对我来说效率很低。
答案 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相同的数据。