SAS - 数据集未按预期排序

时间:2017-10-09 12:13:18

标签: sorting sas

在重构一些代码时,我试图复制各种数据集。我正在以下列方式确认重构。我导入实时/原始数据集,对其进行排序by _all_。我对重构的数据集by _all_进行排序。然后我比较两者。

%macro   Validate(dataset);

  data live_&dataset.;
    set inFinal.&dataset.;
  run;

  proc sort data = live_&dataset. out = validation_original;
    by _all_;
  run;

  proc sort data = &dataset. out = validation_refactor;
    by _all_;
  run;

  proc compare error note 
    base      = validation_original
    compare   = validation_refactor
    ;
  run;

%mend;

这适用于一个奇怪的案例。该数据集包含begin_dateend_datePROC COMPARE会对这些值产生错误。当我调查时,碰巧存在两行包含相同值但begin_dateend_date的行。尽管已经通过PROC SORT运行,但原始数据集未正确排序。

Refactored Dataset
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|
|  id | numerator | denominator | rate | begin_date | end_date   | junk1 | junk2 | junk3 |
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|
| 123 |         0 |     0.41504 |    0 | 10/01/2015 | 10/31/2015 | ABC   | XYZ   | IOU   |
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|
| 123 |         0 |     0.41504 |    0 | 11/01/2015 | 11/30/2015 | ABC   | XYZ   | IOU   |
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|

Original Dataset
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|
|  id | numerator | denominator | rate | begin_date | end_date   | junk1 | junk2 | junk3 |
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|
| 123 |         0 |     0.41504 |    0 | 11/01/2015 | 11/30/2015 | ABC   | XYZ   | IOU   |
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|
| 123 |         0 |     0.41504 |    0 | 10/01/2015 | 10/31/2015 | ABC   | XYZ   | IOU   |
|-----+-----------+-------------+------+------------+------------+-------+-------+-------|

我无法解释为什么会这样。错误排序仅发生在此特定数据集中。当我通过PROC CONTENTS检查内容时,它们是相同的:它们具有相同数量的观察,相同的类型,相同的len,相同的格式,相同的排序顺序,相同的编码。一切看起来都是一样的。

  • 还有另一种验证两个数据集的方法吗?
  • 这可能是PROC SORT的错误吗?
  • 这可能是日期在记忆中如何表现的结果? (即浮点表示错误)

1 个答案:

答案 0 :(得分:1)

由于"分母",数据集未按预期排序。当除了"分母"之外的所有变量执行排序时,数据集按预期排序并比较为相同。

 <?php 
    class Follow extends User{
        public function __construct($pdo){
            $this->pdo  = $pdo;
        }

        public function follow($user_id, $followerID){
            //here will be query to insert follow in database

            //now i need to sendNotification method from user
            Message::sendNotification($user_id, $followerID, 'follow'); 

        }
    }
?>

计算&#34;分母&#34;的方法原始和重构之间有所不同。这可能会引入一点点表示错误。

为了实现验证,我做了以下工作。我重新排列了重构数据集,以便所有计算列最后出现。 Fatal error: Uncaught Error: Using $this when not in object context 只关心行的顺序而不关心列。因此,在对原始数据集进行排序之前,我获得了重构中的变量列表,并使用该列表对原始数据集进行了排序。无论列实际是什么,此方法都会在所有数据集中进行推广。

  proc sort data = live_&dataset. out = validation_original;
    by 
      id
      numerator
      rate
      begin_date
      end_date
      junk1
      junk2
      junk3
    ;
  run;