2017-10-09 8 views
0

Beim Refactoring eines Codes versuche ich, verschiedene Datensätze zu replizieren. Ich bestätige die Refactors wie folgt. Ich importiere den Live-/Originaldatensatz, sortiere ihn by _all_. Ich sortiere den refaktorierten Datensatz by _all_. Ich vergleiche dann die beiden.SAS - Datensatz wird nicht wie erwartet sortiert

%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; 

Dies funktioniert aber für einen bizarren Fall. Der Datensatz enthält eine begin_date und end_date. PROC COMPARE löst einen Fehler bei diesen Werten aus. Wenn ich nachforsche, passiert es, dass zwei Zeilen existieren, die identische Werte enthalten, aber für begin_date und end_date. Der Originaldatensatz ist trotz Durchlaufen PROC SORT nicht korrekt sortiert.

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 | 
|-----+-----------+-------------+------+------------+------------+-------+-------+-------| 

Ich kann nicht erklären, warum dies ist. Die Fehlsortierung geschieht nur mit diesem bestimmten Datensatz. Wenn ich den Inhalt über PROC CONTENTS überprüfe, sind sie identisch: sie haben die gleiche Anzahl von Beobachtungen, den gleichen Typ, die gleichen len, das gleiche Format, die gleiche Sortierreihenfolge, die gleiche Kodierung. Alles scheint identisch zu sein.

  • Gibt es eine andere Möglichkeit, die beiden Datensätze zu validieren?
  • Könnte das ein Fehler sein mit PROC SORT?
  • Könnte es eine Konsequenz davon sein, wie das Datum im Speicher dargestellt wird? (d. h. Gleitkommadarstellungsfehler)

Antwort

1

Der Datensatz wird wegen "Nenner" nicht wie erwartet sortiert. Wenn die Sortierung von allen Variablen außer "Nenner" durchgeführt wird, werden die Datensätze wie erwartet sortiert und als identisch verglichen.

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

Die Methode zur Berechnung des "Nenners" unterscheidet zwischen Original und Refactor. Dies führt wahrscheinlich zu einem leichten Darstellungsfehler.

Um die Validierung zu implementieren, habe ich Folgendes getan. Ich habe die refaktorierten Datensätze neu angeordnet, so dass alle berechneten Spalten zuletzt erschienen sind. PROC COMPARE kümmert sich nur um die Reihenfolge der Zeilen und nicht um die Spalten. Vor dem Sortieren des Originaldatensatzes habe ich also eine Liste der Variablen im Refactor erhalten und den Originaldatensatz damit sortiert. Dieser Ansatz wird auf alle Datensätze verallgemeinert, unabhängig davon, was die Spalten tatsächlich sind.

%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

Die Verwendung der "Runden" -Funktion (z. B. 5 d. P.) Bei der Berechnung des Nenners wird die Konsistenz über die Datensätze sicherstellen. – Longfish

Verwandte Themen