2013-05-07 14 views
5

ich einen Datensatz bin mit der etwas ist wie:Füllen Sie die leeren Werte einer Variablen mit dem vorherigen nicht leeren Wert SAS 9.3

+----------+--------+-------+ 
| Variable | Level | Value | 
+----------+--------+-------+ 
| sexe  | men | 10 | 
|   | female | 20 | 
| age  | 0-20 |  5 | 
|   | 20-40 |  5 | 
|   | 40-60 | 10 | 
|   | >60 | 10 | 
+----------+--------+-------+ 

Und ich möchte die „leeren“ Zellen erfüllen die vorherige Verwendung nicht leere Zelle, um so etwas zu erhalten.

+----------+--------+-------+ 
| Variable | Level | Value | 
+----------+--------+-------+ 
| sexe  | men | 10 | 
| sexe  | female | 20 | 
| age  | 0-20 |  5 | 
| age  | 20-40 |  5 | 
| age  | 40-60 | 10 | 
| age  | >60 | 10 | 
+----------+--------+-------+ 

Ich habe versucht, verschiedene Möglichkeiten in DATA Schritt hauptsächlich mit der LAG() Funktion. Die Idee war, die vorherige Zeile zu lesen, wenn die Zelle leer war und damit zu füllen.

DATA test; 
    SET test; 

    IF variable = . THEN DO; 
     variable = LAG1(variable); 
    END; 
RUN; 

Und ich erhalten

+----------+--------+-------+ 
| Variable | Level | Value | 
+----------+--------+-------+ 
|   | men | 10 | 
| sexe  | female | 20 | 
|   | 0-20 |  5 | 
| age  | 20-40 |  5 | 
|   | 40-60 | 10 | 
|   | >60 | 10 | 
+----------+--------+-------+ 

Das Problem war die gute Saite nicht immer oben nur eine Zeile ist. Aber ich verstehe nicht, warum SAS in der ersten und dritten Zeile leer gemacht hat. Es musste diese Zeile nicht geändert werden, weil ich "If variable =." Sagte. Ich weiß, wie dies in Python oder in R mit einigen for-Schleife zu tun, aber ich habe keine gute Lösung in SAS gefunden.

Ich habe versucht, die Zeichenfolge in eine Variable mit "CALL SYMPUT" und auch mit "RETAIN" zu setzen, aber es hat auch nicht funktioniert.

Es muss einen einfachen und eleganten Weg geben, dies zu tun. Irgendeine Idee?

+0

Nützliche Frage. Danke vielmals. – stan

Antwort

18

Sie können LAG nicht in einem IF verwenden und erhalten dieses Ergebnis - LAG funktioniert nicht so, wie Sie denken. RETAIN ist die korrekte Art und Weise, die ich sagen würde:

Verzögerung geht nicht wirklich zum vorherigen Datensatz und erhält seinen Wert; Es erstellt eine Warteschlange, und jedes Mal, wenn LAG aufgerufen wird, nimmt es einen Datensatz von der Vorderseite ab und fügt der Rückseite einen Datensatz hinzu. Das bedeutet, wenn sich LAG in einem bedingten Block befindet, wird sie nicht für die falsche Bedingung ausgeführt, und Sie erhalten Ihre Warteschlange nicht. Sie können IFN- und IFC-Funktionen verwenden, die unabhängig vom booleschen Wert sowohl wahre als auch falsche Bedingungen auswerten, aber in diesem Fall ist RETAIN wahrscheinlich einfacher.

+0

Arbeiten perfekt und die Erklärungen sind sehr klar! Vielen Dank Joe! Es ist das zweite Mal, dass du mir hilfst und so schnell. Wie geht es dir? Verfolgen Sie alle Fragen per RSS? – jomuller

+0

RSS ist eigentlich ziemlich langsam zu aktualisieren (aber, ja, in einigen Fällen); du hast es zufällig kurz danach gefragt, nachdem ich eine andere Frage beantwortet habe :) – Joe

+0

Nützliche Antwort. Danke vielmals. – stan

Verwandte Themen