在SAS中合并时,是否有一种简单的方法可以从一个数据集中删除所有变量?

时间:2010-07-05 06:04:49

标签: sas

假设我已经通过变量'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要求您在合并数据集之前“手动”对数据集进行排序,这令人烦恼。如果它不允许你合并数据集,除非它们被正确排序,为什么它不是只在你使用合并时为你做?思考?也许有一种解决方法,我不知道。

1 个答案:

答案 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特别大,可以节省大量时间。