gpt4 book ai didi

在 SAS 中对几乎排序的数据集进行排序

转载 作者:行者123 更新时间:2023-12-04 07:37:21 26 4
gpt4 key购买 nike

我在 SAS 中有一个大数据集,我知道它几乎已排序;我知道第一级和第二级是排序的,但第三级不是。此外,第一级和第二级包含大量不同的值,因此当我知道前两列的顺序已经正确时,再对前两列进行排序就更不理想了。数据示例如下所示:

ID标签频率
1 乔恩 20
约翰一书 5
2 马修 2
2 马修 7
2 马特 5
3 国家 1
3 娜塔莉 4

在 proc 排序上使用“预排序”选项似乎只检查数据是否按每个键排序,否则它会对数据进行完整排序。有没有办法告诉 SAS 前两列已经排序?

最佳答案

如果您之前已按前 2 个变量对数据集进行排序,则不管 sortedby数据集上的信息,SAS 将花费更少的 CPU 时间对其进行排序 *.这是大多数体面的排序算法的自然属性 - 对已经几乎排序的东西进行排序的工作要少得多。

* 只要你不使用 force proc sort 中的选项语句,这会强制它进行冗余排序。

这是我运行的一个小测试:

option fullstimer;
/*Make sure we have plenty of rows with the same 1 + 2 values, so that sorting by 1 + 2 doesn't imply that the dataset is already sorted by 1 + 2 + 3*/
data test;
do _n_ = 1 to 10000000;
var1 = round(rand('uniform'),0.0001);
var2 = round(rand('uniform'),0.0001);
var3 = round(rand('uniform'),0.0001);
output;
end;
run;

/*Sort by all 3 vars at once*/
proc sort data = test out = sort_all;
by var1 var2 var3;
run;

/*Create a baseline dataset already sorted by 2/3 vars*/
/*N.B. proc sort adds sortedby information to the output dataset*/
proc sort data = test out = baseline;
by var1 var2;
run;

/*Sort baseline by all 3 vars*/
proc sort data = baseline out = sort_3a;
by var1 var2 var3;
run;

/*Remove sort information from baseline dataset (leaving the order of observations unchanged)*/
proc datasets lib = work nolist nodetails;
modify baseline (sortedby = _NULL_);
run;
quit;

/*Sort baseline dataset again*/
proc sort data = baseline out = sort_3b;
by var1 var2 var3;
run;

我得到的相关结果如下:
  • SAS 用了 8 秒时间按所有 3 个变量对原始完全未排序的数据集进行排序。
  • SAS 从已经按 2/3 变量排序的基线数据集开始,用 4 秒钟按 3/3 排序。
  • SAS 花了 4 秒钟从相同的基线数据集开始按 3/3 进行排序,在从中删除排序信息后。

  • 日志输出的相关指标是用户 CPU 时间量。

    当然,如果几乎排序的数据集非常大并且包含许多其他变量,您可能希望在替换时避免由于写入开销而导致的排序。您可以采用的另一种方法是创建一个复合索引 - 例如,这将允许您执行涉及组处理的操作。
    /*Alternative option - index the 2/3 sorted dataset on all 3 vars rather than sorting it*/
    proc datasets lib = work nolist nodetails;
    /*Replace the sort information*/
    modify baseline(sortedby = var1 var2);
    run;
    /*Create composite index*/
    modify baseline;
    index create index1 = (var1 var2 var3);
    run;
    quit;

    创建索引需要读取整个数据集,排序也是如此,但只需要重新写出它所涉及的工作的一小部分,并且在某些情况下可能比 2/3 到 3/3 排序快。

    关于在 SAS 中对几乎排序的数据集进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27131610/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com