2012-04-13 7 views
2

Das folgende Bit von SAS-Code soll aus einem Dataset lesen, das eine numerische Variable namens "Radvalue" enthält. Radwert ist die Temperatur eines Heizkörpers, und wenn ein Heizkörper ausgeschaltet wird, aber seine Temperatur um 2 oder mehr steigt, ist es ein Zeichen dafür, dass er eingeschaltet ist, und wenn er eingeschaltet ist, aber seine Temperatur um 2 oder mehr abnimmt, ist dies ein Zeichen dafür es ist ausgegangen. Radstate ist eine neue Variable im Datensatz, die für jede Beobachtung angibt, ob der Heizkörper ein- oder ausgeschaltet ist, und ich versuche, dies automatisch für den gesamten Datensatz zu tun. Ich versuche also, die LAG-Funktion zu verwenden, indem ich versuche, die erste Zeile zu initialisieren, die keinen dif_radwert hat, und dann versuche, den gerade beschriebenen Algorithmus auf Zeile 2 anzuwenden. Irgendeine Idee, warum die Spalten Radstate und l_radstate völlig leer ausgehen?Weitere Probleme mit der LAG-Funktion ist SAS

Danke everso viel !! Lassen Sie es mich wissen, wenn ich das Problem nicht klar erklärt habe.

Data work.heating_algorithm_b; 
Input ID Radvalue; 
Datalines; 
    1 15.38 
    2 15.38 
    3 20.79 
    4 33.47 
    5 37.03 
    6 40.45 
    7 40.45 
    8 40.96 
    9 39.44 
    10 31.41 
    11 26.49 
    12 23.06 
    13 21.75 
    14 20.16 
    15 19.23 
; 

DATA temp.heating_algorithm_c; 
SET temp.heating_algorithm_b; 

DIF_Radvalue = Radvalue - lag(Radvalue); 

l_Radstate = lag(Radstate); 

if missing(dif_radvalue) then 
    do; 
    dif_radvalue = 0; 
    radstate = "off"; 
    end;        
else if l_Radstate = "off" & DIF_Radvalue > 2 then Radstate = "on"; 
else if l_Radstate = "on" & DIF_Radvalue < -2 then Radstate = "off"; 
else Radstate = l_Radstate; 
run; 
+0

Post einige Beispieleingangsdaten, idealerweise mit Datenleitungen oder Karten, um logische Probleme mit Ihrem Code zu lösen, wenn eine –

+0

Hallo, danke - hier einige Beispieldaten ist: Eingang ID Radvalue; Datalinen; 15,38 15,38 20,79 33,47 37,03 40,45 40,45 40,96 39,44 31,41 26,49 23,06 21,75 20,16 19,23 ; –

Antwort

0

Sie haben versucht, die LAG-Funktion für eine Variable auszuführen, die nur im Ausgabedatensatz (RADSTATE) vorhanden ist. Ich ersetzte die LAG auf RADSTATE mit einem RETAIN. Außerdem hatten Sie Recht, die LAG-Funktion außerhalb jeder Bedingungslogik zu halten ... Versuchen Sie den folgenden Code.

Data work.heating_algorithm_b; 
Input ID Radvalue; 
Datalines; 
    1 15.38 
    2 15.38 
    3 20.79 
    4 33.47 
    5 37.03 
    6 40.45 
    7 40.45 
    8 40.96 
    9 39.44 
    10 31.41 
    11 26.49 
    12 23.06 
    13 21.75 
    14 20.16 
    15 19.23 
; 

DATA work.heating_algorithm_c; 
length radstate $3; 
retain radstate; 
SET work.heating_algorithm_b; 

old_radvalue=lag(radvalue); 

if _n_=1 then do; 
    dif_radvalue=0; 
    radstate="off"; 
end; 
else do; 
    DIF_Radvalue = Radvalue-Old_Radvalue; 

    if Radstate = "off" & DIF_Radvalue > 2 then Radstate = "on"; 
    else if Radstate = "on" & DIF_Radvalue < -2 then Radstate = "off"; 
    /* Else Radstate stays the same */ 
end; 
run; 
+0

Hallo - danke für deine Hilfe. Ich führe den obigen Code (unter Verwendung der Beispieldaten, die ich auf Ihren anderen Kommentar gesetzt habe): Zeile 1: l_radstate = "", dif_radvalue = 0, radstate = off. Zeile 2: L_radstate = "", dif_radvalue = ".", Radstate = "" Zeile 3 weiter: l_radstate = "", dif_radvalue funktioniert gut, radstate = "" Erhalten Sie dasselbe? Ich frage mich, warum dieser zweite dif_radvalue nicht funktioniert. Danke nochmal! –

+0

Fantastisch !! Funktioniert perfekt. Vielen Dank für Ihre Hilfe! –

0

Ich habe keine SAS Erfahrung, aber vielleicht brauchen Sie eine missing(l_Radstate) Prüfung beim ersten Mal durch, vielleicht etwas zu decken:

if missing(l_Radstate) then 
do; radstate = "off"; end; 

ich denken würde, nur, wenn die Radvalue - lag(Radvalue) benötigt tun nicht erzwingen DIF_Radvalue zu fehlen. Wenn das der Fall ist, bin ich nicht sicher, was helfen würde ...

+0

Hallo, danke für deinen Vorschlag - leider scheint es nicht zu funktionieren! –