2016-04-11 9 views
1

Ich habe ein Dataset, in dem ich Dinge in Minuten umwandele. Es sieht wie folgt aus:Schreiben Sie eine SAS-Gleichung, auch wenn Werte eleganter fehlen

id  hours  minutes 
    1  1   5 
    2   .   45 
    3   1   . 

ETC

ich alles Minuten konvertieren wollen, so schrieb ich folgendes:

DATA TEST; 
    SET Original; 
    in_minutes = 60*hours + minutes; 
RUN; 

Jetzt weiß ich, dass für fehlende Werte dieser kehrt . aber ich will es um den korrekten Wert für Beispiel 1 zurückzugeben wäre 65 und ID 2 wäre 45 und ID 3 wäre 60.

Ich denke, ich könnte schreiben:

Aber das scheint, als könnte es kompliziert sein, wenn Sie eine Gleichung mit mehr Stücken machen würden. Gibt es einen eleganteren Weg, die fehlenden Gleichungen zu behandeln, wenn es nicht etwa sum oder avg ist?

Antwort

4

ich SAS TIME (Sekunden) umwandeln würde und coalesce Funktion zum Beispiel verwenden.

data time; 
    input hours  minutes; 
    duration = hms(coalesce(hours,0),coalesce(minutes,0),0); 
    format duration hhmm8.; 
    cards; 
1 5 
. 45 
1 . 
46 20 
. 200 
;;;; 
    run; 

enter image description here

2

Ich benutze die Tatsache, dass die sum() Funktion tolerant fehlt, ist:

x = sum(.,1) => x=1 

x = .; 
x = sum(x,0) => x=0 

So versuchen:

in_minutes = 60*sum(0,hours) + sum(0,minutes); 
+0

Oh, ich mag das! Das ist schlau. –

+0

Wenn Sie 0 einschließen müssen, funktioniert es eher wie coalesce() als die Funktion sum(). – Reeza

1

könnten Sie die SUM() Funktion zusätzlich auch mit einigen fehlenden Werten auszuführen.

in_minutes = sum(60*hours,minutes); 

Sie erhalten immer noch einen fehlenden Wert, wenn sowohl HOURS als auch MINUTES fehlen.

Sie könnten einen weiteren Funktionsaufruf SUM() (oder einen Funktionsaufruf COALESCE()) hinzufügen, um die Warnung über das Generieren fehlender Werte zu löschen, wenn HOURS fehlt.

Aber dies bedeutet, dass, wenn beide fehlen, erhalten Sie 0 statt zu fehlen. Sie könnten mehr Logik hinzufügen, um nur dann die Berechnung durchzuführen, wenn mindestens einer der Werte existiert.

if n(hours,minutes) then in_minutes = sum(60*sum(hours,0),minutes); 
+0

Erzeugt der erste noch immer Meldungen über fehlende Werte im Protokoll? – Reeza

+0

Sicher erzeugt es Nachricht, aber es erzeugt keine tatsächlichen fehlenden Werte, es sei denn beide HOURS und MINUTES fehlen, im Gegensatz zum '+' Operator. – Tom

Verwandte Themen