SAS中是否有任何固有方法来查找数据集的排序顺序?
5 回答
正如 Sassy 所说,SAS 知道数据集是否已排序的唯一方法是它是否进行了排序,或者您是否明确告诉它排序顺序。如果您没有完成这些步骤中的任何一个,它将不知道数据是否处于任何类型的顺序中。
我喜欢 AFHood 试图对其进行排序的想法。如果 SAS 知道它是以这种方式排序的,它只会告诉您并且不会再这样做。
NOTE: Input data set is already sorted, no sorting done
以下是研究数据排序的其他一些想法……享受吧。
如果只想手动查看,可以使用 proc contents data=libname.data;run; 并查看输出。有一个属性叫做 sorted。如果您使用的是窗口模式,您可以右键单击资源管理器中的数据集并选择属性,然后单击详细信息选项卡并查看排序依据值。
对于程序化测试方法,您可以使用来自 proc 内容的输出数据集。sorted 和 sortedby 列将告诉您数据集是否已排序以及它是按哪个变量排序的。通过运行下面的代码来尝试一下。
/* In an unsorted data set, proc contents will give missing values
for the sorted and sortedby columns of its output data */
proc contents data=sashelp.class out=class_contents noprint;run;
proc print data=class_contents;
var memname name sorted sortedby;
run;
/* Now sort and observe the changes in the sorted and sortedby columns */
proc sort data=sashelp.class out=class_sorted; by name;run;
proc contents data=class_sorted out=class_sorted_contents;run;
proc print data=class_sorted_contents;
var memname name sorted sortedby;
run;`enter code here`
如果数据确实已经“排序”,是的。在 proc 内容生成的输出底部有一个关于排序信息的小表格。
使用已经按某种排序顺序的数据构建的数据集可能没有附加此信息,您将需要开始探索数据以确定其顺序。
您可以使用该Attrc
功能。
http://support.sas.com/onlinedoc/913/getDoc/en/lrdict.hlp/a000147794.htm上的文档
它类似于以下内容
data _null_;
dsid=open("work.a","i");
sortby=attrc(dsid,"SORTEDBY");
put sortby=;
rc=close(dsid);
run;
我假设您正在解决的问题是试图确定数据集是否需要以编程方式进行排序。我们使用的最佳解决方案是在有疑问时简单地使用 proc sort。
当然,您可能会说,这是开销和处理.. 是的,但是如果数据集已经正确排序,则 proc 知道它并让您的代码以最少的处理继续前进。它内置了“如果排序然后继续”逻辑。
如果这不是您要解决的问题,请详细说明,我们会看看是否可以提供帮助。
如果 sas 没有对数据进行排序,但您认为它可能已排序,则可以尝试将其视为已排序并处理可能会或可能不会发生的错误。
* This works, swap some values to see how an error looks;
data foo;
input height;
cards;
1
2
3
4
;
run;
data _null_;
set foo;
by height;
run;
可以在宏中检测和重置错误状态,但这种方法可能会变得混乱。更多信息在这里