2009-06-09 8 views
2

Gibt es einen Befehl oder einen schnellen Weg, um alle vorhandenen Variablen im PDV zu verwerfen?PDV-Variablen spülen

Ich habe einige Code, der wie folgt lautet:

Data example2; 
var1='A'; 
Var2='B'; 
Var3='C'; 
/* etc*/ 
output; 
Var1='B'; 
output; 
stop; 
run; 

, sobald der erste ‚Output‘ Anweisung erreicht wird ich alle PDV Variablen fehlt zurücksetzen möchten (zB var2 = ‚‘; var3 = '';), ohne sie manuell als solche deklarieren zu müssen. Kann jemand helfen?

+0

Jede Chance, dass Sie es in zwei Datenschritte brechen könnte? – AFHood

+0

könnte ich - aber würde es lieber als einen Schritt ... –

Antwort

7

Der Aufruf fehlende Routine und die _all_ automatische Variablenliste wird es leicht tun

call missing(of _all_); 

Zum Beispiel

Data example2; 
var1='A'; 
Var2='B'; 
Var3='C'; 
output; 
call missing(of _all_); 
Var1='B'; 
output; 
stop; 
run; 

proc print data=example2; 
run; 

produziert

        The SAS System 

           Obs var1 Var2 Var3 

           1  A  B  C 
           2  B 
+0

Ich dachte Anruf fehlender wäre nützlich ... wusste nicht über das _all_ Schlüsselwort ... nice –

+0

Es gibt auch _character_ und _numeric_ automatische Variablenlisten (wie simonn in seiner Antwort verwendet), wenn Sie nur nur das Zeichen ändern möchten Variablen oder nur die numerischen Variablen. Sehr praktisch! Hier ist eine Referenz: http://support.sas.com/documentation/cdl/en/lrcon/61722/HTML/default/a000695105.htm – cmjohns

+0

sehr aufgeräumt - danke! –

1

Sie können es mit Arrays tun.

Hier ist ein Makro, das alles in der PDV fehlt. Mit dem Parameter t können Sie ihn mehrmals von einem einzigen Datenschritt aus aufrufen.


%macro cleanpdv(t); 
array __c&t{*} _character_; 
array __n&t{*} _numeric_; 
do __i&t=1 to dim(__c&t); 
    call missing(__c&t{__i&t}); 
end; 
do __i&t=1 to dim(__n&t); 
    call missing(__n&t{__i&t}); 
end; 
drop __i&t; 
%mend; 

Man könnte es wie folgt verwenden:



Data example2; 
var1='A'; 
Var2='B'; 
Var3='C'; 
/* etc*/ 
output; 
%cleanpdv(1); 
Var1='B'; 
output; 
%cleanpdv(2); 
output; 
stop; 
run; 

, die folgende Datensatz erzeugt:

 
    Obs var1 Var2 Var3 

    1  A  B  C 
    2  B 
    3 
+0

Dank simonn - einige erweiterte Array-Logik in dieser Lösung .. –

+0

eigentlich simonn - Ich finde mich mit Ihrer Lösung häufiger als der Aufruf fehlende Routine - wie Ihr Code kann schnell geändert werden, um alle "fehlenden" Variablen in Nullen umzuwandeln. –

Verwandte Themen