【问题标题】:How to sort data using Data step in SAS如何使用 SAS 中的数据步骤对数据进行排序
【发布时间】:2018-05-31 12:24:47
【问题描述】:

我想在 SAS 数据步骤中对数据进行排序。我的意思是:proc sort的工作应该在数据步骤中完成。有什么解决办法吗?

【问题讨论】:

  • 很想知道你为什么要做这样的事情。
  • 刚刚知道了。没有必要以复杂的方式这样做。但出于热情和焦虑,我想知道:在数据步骤中是否可能。我在谷歌搜索,但我没有找到任何答案,所以我在这里发布。

标签: sas datastep


【解决方案1】:

如果您正在寻找仅数据步骤的解决方案,您可以使用hash table 完成PROC SORT 的工作。需要注意的是,您需要足够的内存来执行此操作。

如果您想做一个简单的排序,您可以使用ordered:'yes' 选项加载哈希表并将其输出到一个新表。默认情况下,ordered:yes 将按升序对数据进行排序。您也可以指定descending

简单排序

data _null_;

    /* Sets up PDV without loading the table */
    if(0) then set sashelp.class;

    /* Load sashelp.class into memory ordered by Height. Do not remove duplicates. */
    dcl hash sortit(dataset:'sashelp.class', ordered:'yes', multidata:'yes');

        sortit.defineKey('Height');     * Order by height;
        sortit.defineData(all:'yes');   * Keep all variables in the output dataset;

    sortit.defineDone();

    /* Output to a dataset called class_sorted */
    sortit.Output(dataset:'class_sorted');
run;

重复数据删除

要删除重复项,请执行完全相同的操作,除了删除multidata 选项。在下表中,观察 (8, 9) 和 (15, 16) 是彼此重复的。观察 9 和 16 将被消除。

data _null_;

    /* Sets up PDV without loading the table */
    if(0) then set sashelp.class;

    /* Load sashelp.class into memory ordered by Height. Do not keep duplicates. */
    dcl hash sortit(dataset:'sashelp.class', ordered:'yes');

        sortit.defineKey('Height');     * Order by height;
        sortit.defineData(all:'yes');   * Keep all variables in the output dataset;
    sortit.defineDone();

    /* Output to a dataset called class_sorted */
    sortit.Output(dataset:'class_sorted');
run;

【讨论】:

    【解决方案2】:

    Stu 击败了我,但前提是您的数据集包含唯一键,并且您可以将整个内容放入内存中,您可以使用哈希排序,例如:

    data _null_;
      if 0 then set sashelp.class;
      declare hash h(dataset:"sashelp.class",ordered:"a");
      rc = h.definekey("age","sex","name");
      rc = h.definedata(ALL:'yes');
      rc = h.definedone();
      rc = h.output(dataset:"class_sorted");
      stop;
    run;
    

    如果你真的决定避免使用任何内置的排序方法,一个特别愚蠢的方法是将整个数据集加载到一系列临时数组中,使用手动编码算法对数组进行排序,然后再次导出:

    https://codereview.stackexchange.com/questions/79952/quicksort-in-sas-for-sorting-datasets

    【讨论】:

      【解决方案3】:

      使用proc ds2有解决办法。

      /*Just prepare dataset, because DS2 responds with an error on libraries like sashelp. */
      data sql_prep;
      set sashelp.class;
      run;
      
      /*Delete test dataset before ds2 func, to avoid errors*/
      proc datasets nodetails nolist;
      delete test;
      run;
      
      proc ds2;
      
      data test;
         method run();
            set {select * from sql_prep order by Weight};
         end;
      enddata;
      run;
      quit;
      

      更多 info 关于 sashelp 库的 ds2 错误。

      Appendix 进入 ds2 文档,关于 ds2 中的 sql。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-17
        • 2019-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        相关资源
        最近更新 更多