【问题标题】:Check if sas datasets are sorted检查 sas 数据集是否已排序
【发布时间】:2015-03-12 11:47:04
【问题描述】:

我有一个包含 100 个 sas 数据集的文件夹。我需要创建一个包含两列的新表(数据集名称,已排序/未排序)。

我知道 proc 内容可用于检查排序条件,但有没有办法以编程方式对所有 100 个数据集进行检查并将结果返回到单个表中?

【问题讨论】:

  • proc contents 和视图sashelp.vtable 的列sorttype(和相关的字典表)都可以使用。最佳方法取决于您的用例。也许您可以提供一些有关您的问题的更多细节和细节。
  • 我对您的要求做了一些澄清(根据您的第一句话),如果有误,请进一步编辑和澄清。

标签: sas


【解决方案1】:

使用 DICTIONARY.TABLES,这相当简单。

proc sql;
  create table sorted_tables as
    select memname, sorttype
    from dictionary.tables
    where libname='MYLIB'
  ;
quit;

这基本上是 PROC CONTENTS 的程序化版本,可让您访问相同的信息。如果您需要更多信息,请参阅Kirk Lafler's excellent paper

“S”表示已排序,“SK”表示已排序-nodupkey。可能还有其他值,我不确定。

【讨论】:

  • 这仅在 SAS“知道”数据集已排序时才有效。如果您制作一个包含 10 条 id=1 到 10 的记录的数据集,SAS 将不知道它已“排序”,因为它从未经过 PROC SORT 或类似的处理。通过在实际上未排序的数据集上使用 sortedby 选项,也可以稍微欺骗 SAS。 PROC 内容将显示 sorted=yes。字典表显示 sorttype='W'。所以部分地,答案取决于你所说的“排序”。
  • SORTED 在 SAS 中具有特殊含义。如果 SAS 无法确定数据集是否已排序,则不是。它可能按特定的顺序排列,但除非元数据反映它,否则它不会被排序。如果使用了 SOLTEDBY 选项,则 VALIDATED 选项指示 NO。这个链接对于这个讨论很有用support.sas.com/documentation/cdl/en/lrcon/62955/HTML/default/…
【解决方案2】:

Proc 内容/dictionary.tables 并不总能说出完整的故事。有时数据集可能处于排序状态而没有反映这一点的元数据,例如如果它们是在没有排序的情况下按排序顺序生成的,或者作为已排序数据集的子集生成。我写了一个小例子来演示这是如何发生的:

proc datasets lib = work memtype = data kill;
    run;
quit;

data  example                     /*False negative - sorted by name, but no sort metadata present*/
      example2(sortedby = weight) /*Flagged as W - false positive based on user-supplied metadata*/
      example3(sortedby = name)   /*Flagged as W - correct value based on user-supplied metadata*/
      example4                    /*Flagged as S - sorted*/
      example5                    /*Flagged as SK - sorted with no duplicate key values*/
      example6                    /*Flagged as SR - sorted with no duplicate records*/
      example7;                   /*Flagged as SR - sorted with no duplicate records*/
  set sashelp.class;
run;

proc sort data = example4;
  by name;
run;

proc sort data = example5 nodupkey;
  by name;
run;

proc sort data = example6 noduprecs;
  by sex;
run;

proc sort data = example7 nodup;
  by sex;
run;

proc sql;
  create table sorted_tables as
    select libname, memname, sorttype
    from dictionary.tables
    where libname = 'WORK'
   ;
quit;

如果您想确定,一种方法是尝试使用按组处理来完整读取每个数据集 - 如果自动宏变量 &SYSERR数据集未排序:

data _null_;
    set example(keep = name);
    by sex;
run;

%put &SYSERR; /*Returns 1012 - not sorted*/

data _null_;
    set example(keep = name);
    by name;
run;

%put &SYSERR; /*Returns 0 - sorted*/

这显然会很慢,并且对于已编入索引但未排序的数据集也会返回误报,但在功能上对于大多数用途而言几乎没有区别。

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 2012-04-08
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2013-08-09
    • 2012-02-05
    相关资源
    最近更新 更多