2017-10-09 81 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