2017-10-09 56 views
0

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

%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

由于“分母”,数据集未按预期进行排序。当除“分母”之外的所有变量执行排序时,数据集按预期进行排序并且相互比较。

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

计算“分母”的方法在原始和重构之间是不同的。这可能会引入一些表示错误。

为了实现验证,我做了以下工作。我重新排列了重构数据集,以便所有计算列都最后出现。 PROC COMPARE只关心行的顺序而不关心列。因此,在对原始数据集进行排序之前,我得到了重构中的变量列表,并使用它对原始数据集进行了排序。无论列的实际情况如何,这种方法都可以在所有数据集中进行概括。

%macro Validate(dataset); 
********************************** 
*** Import 
**********************************; 
    data live_&dataset.; 
    set inFinal.&dataset.; 
    run; 

********************************** 
*** Arrange for PROC COMPARE 
**********************************; 
    proc sort data = &dataset. out = validation_refactor; 
    by _all_; 
    run; 

    proc sql noprint; 
    select name 
    into : refactorVariableOrder 
    separated by ' ' 
    from dictionary.columns 
    where libname = 'WORK' 
     and memname = "%upcase(&dataset.)" 
    ; 
    quit; 

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

********************************** 
*** Validate 
**********************************; 
    proc compare error note 
    base  = validation_original 
    compare = validation_refactor 
    ; 
    run; 
%mend; 
+0

计算分母时使用'round'函数(例如5个d.p.)将确保所有数据集的一致性。 – Longfish