【问题标题】:Is there an easy way to drop all variables from one of the datasets when merging in SAS?在 SAS 中合并时,是否有一种简单的方法可以从一个数据集中删除所有变量?
【发布时间】:2010-07-05 06:04:49
【问题描述】:

假设我已经按照变量“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 要求您在合并数据集之前“手动”排序数据集,这很烦人。如果它不会让你合并数据集,除非它们被正确排序,那么为什么在你使用合并时它不为你做呢?想法?也许有一种我不知道的方法。

【问题讨论】:

    标签: sas


    【解决方案1】:

    对于合并语句和 PDV 在其中的工作方式,存在排序要求。 实在是没办法了。

    但是,这里基本上您正在查找 set2 以确保您通过等效的内部连接来匹配关键变量(粘石头骨头),您可以通过哈希表更有效地执行此操作或用键设置(当然如果你有索引的话)。

    您想要的最简单和更方便的方法是在 set2 中使用 keep 语句,以便您仅将 by 变量加载到 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 特别大,则可以节省大量时间。

    【讨论】:

    • 人就是这么简单和容易。我觉得很愚蠢! :) 谢谢!我不介意更多地了解 SAS 中的哈希表。如果你有一个好的链接,请随时发送给我。
    • SPDE 数据集实际上确实可以让您忽略手动排序并在合并期间根据需要为您排序数据集,但这些肯定不是我想象的大多数用例......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多