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