2016-08-12 4 views
-1

Ich habe einige SAS Code entlang der Linien von:SAS FIRST.VARIABLE keine Ausgabe geben

DATA MY_SAMPLE; 
    SET SAMPLE; 
    BY A; 
    IF A = 1 THEN B = 1; 
    ELSE IF A ^= 1 THEN B = 0; 
    ELSE IF MISSING(A) THEN B = .; 
    IF FIRST.A; 
RUN; 

, die einen Satz mit 0 Beobachtungen zurückkehrt (es sollte dies nicht tun). Ich habe die Daten nach A sortiert und versucht, die Daten in einen Zwischen-Datensatz zu lesen, bevor ich IF FIRST.A anwende, aber die gleichen Ergebnisse erhalten.

Fehle ich etwas völlig offensichtlich? Ich benutze die erste und letzte die ganze Zeit!

+0

Ein Code sieht gut aus, nur "ELSE IF" -Anweisungen sind in falscher Reihenfolge. Sind Sie sicher, dass Sie Beobachtungen im 'SAMPLE' Datensatz haben? –

+0

Das ist keine gute Frage. Wenn der Datenschritt '0' Beobachtungen zurückgibt, ist das Quell-Dataset leer. Sie sollten mehr darauf achten, was Ihr Log Ihnen sagt. –

Antwort

2

Stimmen Sie mit @Robert überein, der Beispielcode sollte Datensätze ausgeben, vorausgesetzt, dass Datensätze in Ihren Eingabedaten vorhanden sind und sortiert sind.

Ich würde das Protokoll von Ihrem realen Programm/Daten überprüfen, und stellen Sie sicher, dass keine Fehler vorliegen, und dass das Eingabe-Dataset Datensätze enthält.

Wenn das nicht hilft, würde ich einige Debug-PUT-Anweisungen, so etwas wie unten (ungetestet) hinzufügen:

DATA MY_SAMPLE; 
    SET SAMPLE; 
    BY A; 

    IF A = 1 THEN B = 1; 
    ELSE IF A ^= 1 THEN B = 0; 
    ELSE IF MISSING(A) THEN B = .; *This will never be true ; 

    put "Before subsetting if " (_n_ A first.A)(=) ; 
    IF FIRST.A; 
    put "After subsetting if " (_n_ A first.A)(=) ; 
RUN; 

Wie Robert erwähnt, wie geschrieben Ihre Else if Missing(A) würde nie wahr sein, denn wenn A fehlt der vorherige Else if A ^= 1 wird als wahr ausgewertet, da SAS binäre Logik (true/false), nicht trinäre Logik (true/false/null) verwendet.

Auch ich würde für alle streunenden OUTPUT Aussagen in Ihrem Code überprüfen.

0

Überprüft das Protokoll; überprüfte die Eingabe; MSSQL geschlossen; öffnete es wieder und siehe da, Code arbeitete erstmals. Danke für das Downgrade, aber ich habe nicht bemerkt, dass MSSQL anfällig für Zuckungen ist!