假设我已经通过变量'sticks','stones'和'bones'对set1和set2进行了排序,然后我这样做了:
data merged;
merge set1(in=a) set2(in=b);
by sticks stones bones;
if a and b then output;
*else we don't want to do anything;
run;
是否有一种简单的方法可以从合并数据集中的set2中删除所有变量而无需全部输入?我一直遇到这个问题,我有两个数据集 - 都有很多变量 - 我只想用几个变量合并它们,然后只保留其中一个变量的变量。
我通常只是使用proc sql这样的东西,但有一些情况(比上面更复杂),我认为合并更好。
此外,我发现SAS要求您在合并数据集之前“手动”对数据集进行排序,这令人烦恼。如果它不允许你合并数据集,除非它们被正确排序,为什么它不是只在你使用合并时为你做?思考?也许有一种解决方法,我不知道。
答案 0 :(得分:8)
排序的需求用于合并语句和PDV在其中的工作方式。 真的没有办法解决它。
然而,这里基本上你正在查找set2,以确保你通过相当于内连接的关键变量(粘石块骨头)匹配,你可以通过哈希表更有效地做到这一点或者用键设置(如果你有一个索引)。
这里最简单,最方便的方法是在set2中使用keep语句,因此只能通过变量加载到PDV中。 像这样:
data merged;
merge set1(in=a) set2(in=b keep=sticks stones bones);
by sticks stones bones;
if a and b then output;
*else we don't want to do anything;
run;
如果哈希表没有吓到你,并希望在这种情况下了解如何实现它们的更多信息,请随时与我联系以获得更多帮助。
编辑:
这是一篇关于使用哈希表http://www.nesug.org/proceedings/nesug06/dm/da07.pdf的好文章 请记住,使用哈希你应该知道你正在做什么,如果你不知道发生什么事情,他们可能会产生意想不到的结果。 无论如何,使用非常简单和基本的哈希表来解决问题
data merged2;
set set1;
if _N_ = 1 then do;
declare hash h(dataset:"set2");
h.defineKey('sticks','stones','bones');
h.defineData('sticks','stones','bones');
h.defineDone();
end;
rc = h.find();
if rc=0;
drop rc;
run;
此代码的主要优点是不需要对数据集进行排序,以防set2特别大,可以节省大量时间。