如何使用SAS中的数据步骤对数据进行排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用SAS中的数据步骤对数据进行排序相关的知识,希望对你有一定的参考价值。

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

答案

如果您正在寻找仅限数据步骤的解决方案,您可以使用PROC SORT完成hash table的工作。需要注意的是,你需要足够的内存才能做到这一点。

如果要进行简单排序,可以使用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;

D哦-杜平

要删除重复项,请执行完全相同的操作,但删除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;
另一答案

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

另一答案

有使用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;

关于sashelp libs的ds2错误的更多info

Appendix进入ds2 docs,关于ds2中的sql。

以上是关于如何使用SAS中的数据步骤对数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

“BY 变量未正确排序”错误,尽管它已经排序

在宏内部使用变量内部数据集名称时,SAS语法错误22和200

如何使用 apollo 服务器对 graphQl 中的数据进行排序?

Sas程序优化使用较少的工作空间

如何使用 java 对 Amazon dynamodb 中的数据进行排序

如何对ios目标c中的领域数据进行地理距离排序?