2016-07-05 13 views
0

Ich habe einige Daten, die wie dieseErste und letzte Funktion sas

data example1;  
    input Activity $ logflag; 
    Activity1 1 
    Activity2 1 
    Activity3 1 
    Activity4 1 
    Activity1 2 
    Activity2 2 
    Activity3 2 
    Activity1 3 
    Activity2 3 
    Activity3 3 
    Activity4 3 
    Activity1 4 
    Activity2 4 
    ; 
run; 

sieht Wo im Grunde die Variable ‚logflag‘ wird um 1 erhöht, jedes Mal die ‚Aktivität‘ kehrt zu ‚Activity1‘ aber ich zu bekommen Dies;

data example2;  
    input Activity $ logflag count; 
    Activity1 1 1 
    Activity2 1 2 
    Activity3 1 3 
    Activity4 1 4 
    Activity1 2 1 
    Activity2 2 2 
    Activity3 2 3 
    Activity1 3 1 
    Activity2 3 2 
    Activity3 3 3 
    Activity4 3 4 
    Activity1 4 1 
    Activity2 4 2 
    ; 
run; 

Wobei ich habe einen ‚count‘, die jedes Mal, wenn eine neue um 1 erhöht ‚Aktivität‘ in einem gewissen ‚logflag‘ erscheint.

was ich benutze ist dies;

data AS2.TENMAY_EXAMPLE4; 
    set AS2.TENMAY_SESSIONID; 
    by logflag Activity notsorted; 
    if first.logflag then count=0; 
    if first.Activity then count+1; 
run; 

und ich erhalte diesen

data example2;  
    input Activity $ logflag count; 
    Activity1 1 1 
    Activity2 1 2 
    Activity3 1 2 
    Activity4 1 2 
    Activity1 2 1 
    Activity2 2 2 
    Activity3 2 2 
    Activity1 3 1 
    Activity2 3 2 
    Activity3 3 2 
    Activity4 3 2 
    Activity1 4 1 
    Activity2 4 2 
    ; 
run; 

Was kann ich nicht verstehen, warum der Zähler um 1 erhöht dann auf 2 geht aber dann wird nie 3 oder höher. Ich bin mir sicher, dass ich vorher schon gearbeitet habe, aber ich kann nicht herausfinden, was ich geändert habe.

Würde jemand dabei helfen können?

Danke,

+1

Überprüfen Sie und stellen Sie sicher, dass Ihr Eingabe-Dataset nicht bereits die Variable COUNT hat. – Tom

+0

Hallo @ Tom. Vielen Dank. Dies war in der Tat das Problem. Warum sollte es wichtig sein, dass meine Eingabe bereits eine Variable namens COUNT enthält? – Taylrl

Antwort

1

Sie müssen bereits eine Variable namens COUNT im Eingabe-Dataset haben. Jedes Mal, wenn die SET-Anweisung ausgeführt wird, überschreibt der Wert aus dem Eingabe-Dataset den Wert aus der vorherigen Beobachtung.

Um Ihr Beispiel zu bekommen, dann ist COUNT wahrscheinlich 1 für jede Beobachtung. Wenn Sie also inkrementieren, wenn ACTIVITY sich ändert, geht es zu 2. Der Wert für die erste Beobachtung pro LOGFLAG-Gruppe ist 1, da Sie ihn zuerst auf 0 setzen, bevor Sie ihn inkrementieren.

0

Eingangsdaten:

data example1; 
    attrib Activity format = $20. 
     logflag format = 8.; 
    input Activity $ logflag; 
    Activity1 1 
    Activity2 1 
    Activity3 1 
    Activity4 1 
    Activity1 2 
    Activity2 2 
    Activity3 2 
    Activity1 3 
    Activity2 3 
    Activity3 3 
    Activity4 3 
    Activity1 4 
    Activity2 4 
    ; 
run; 

Um das Ergebnis zu nehmen, was Sie dies wollen versuchen:

data example2; 
    set example1; 
    by logflag Activity notsorted; 
    if first.logflag then count=1; 
    else count+1; 
run; 

Das Ergebnis ist:

Activity logflag count 
--------- ------- ----- 
Activity1 1  1 
Activity2 1  2 
Activity3 1  3 
Activity4 1  4 
Activity1 2  1 
Activity2 2  2 
Activity3 2  3 
Activity1 3  1 
Activity2 3  2 
Activity3 3  3 
Activity4 3  4 
Activity1 4  1 
Activity2 4  2 

enter image description here

+0

Ich lief diesen Code und es gab mir immer noch das gleiche, wobei der Zählerstand nicht höher als 2 erhöht. Ich kann sehen, dass Ihr Code hier funktionieren sollte, wie auch der Code, den ich oben verwendet habe. Ich bin verwirrt. – Taylrl

+0

@Taylrl, es ist ein fantastisches :) –

+0

Etwas sehr seltsames geht hier vor. Meine Ergebnisse sind anders als deine. Ich werde recherchieren und zurückmelden: -S – Taylrl

0

Sie vermissen die retain Anweisung. Jedes Mal, wenn die Datenschleifen-Schleifen durchlaufen, wird die Variable zurückgesetzt. Retain unterdrückt dieses Verhalten.

data AS2.TENMAY_EXAMPLE4; 
    set AS2.TENMAY_SESSIONID; 
    retain count; 
    by logflag Activity notsorted; 
    if first.logflag then count=0; 
    count+1; 
run; 
+0

Danke @Jetzler aber selbst mit dieser 'replace' Aussage bekomme ich immer noch das selbe, wobei die Zählung nicht über 2 hinausgeht. Alle Lösungen hier hätte ich gedacht hätte funktionieren sollen . Es muss etwas geben, was uns fehlt – Taylrl

+1

Ja, richtig. Ich habe es einfach überprüft. Die Verwendung einer Summenfunktion "x + y;" hat eine eingebaute Reserve.Es sollte also die ganze Zeit funktionieren. Daher muss das Problem in Ihren Eingabedaten oder einer Einstellung auf Ihrem System liegen. – Jetzler