Hat jemand Verbessungsvorschläge?

Ich hab eine Reihe Macros erstellt, die Variablen beschreiben und auswerten. Als Beispiel hier ein Macro, das die statistischen Kennwerte einer Variablen ausgibt:

%macro statselect(datei,var);
%if &datei= %then %let datei=_last_;
data ;
set &datei;
run;

proc univariate noprint;
output out=stat
n = n
nmiss= nmiss
min = min
max = max
mean= mean
median= median
std= std ;
var &var;
run;

data stat;
set stat;
was="&var";
label
was = 'Variable'
n = 'N'
nmiss = 'Missings'
min = 'Minimum'
mean = 'MW'
median = 'Med'
max = 'Maximum'
std = 'Std';
run;

data merken;
set merken stat;
run;
%mend;

Ruft man dieses Macro mehrfach mit unterschiedlichen Variablen auf, dann steht in merken eine Tabelle mit diesen Kennwerten:

N,Std, MW und KKW-Test für die Ausprägungen

n0 mean0 std0 was

. . .
152 0.61118 0.26358 logmar0
151 0.52914 0.25809 logmar4
152 0.51842 0.27293 logmar8
152 0.47171 0.26153 logmar12

Ich finde das praktisch und habe keine Probleme damit, daß vor dem jeweils ersten Aufruf eines solchen Macros stehen muß:

data merken;
run;

Leider haben die anderen Benutzer dieser Macros große Probleme damit und vergessen das laufend, was dann zu unschönen Ergebnissen führt, weil entweder merken nicht existiert oder schon ungewollt was drin steht.

Ich habe keine Idee, wie man das ändern könnte. Hat hier jemand einen Einfall?

VG Elfriede

Proc append benutzen oder alle Variablen gleichzeitig auswerten

Hallo Elfriede,

statt

data merken;
set merken stat;
run;

kannst du

proc append base=merken data=stat;run;

benutzen.

Der Vorteil von "Proc Append" ist, dass die Basisdatei nach dem Muster der anzuhängenden Datei angelegt wird, wenn sie nicht existiert.

Allerdings ist das keine Lösung für "schon ungewollt was drin steht".

Warum wertest du nicht alle Variablen in einem Schritt aus?

%macro stat(data,Out,Vars);
proc means data=&DATA. noprint;
output out=&OUT.
n=
nmiss=
min=
max=
mean=
median=
std=
/autoname;
var &VARS.;
run;
proc transpose data=&OUT. out=&OUT.(where =(_NAME_ NOT IN ("_TYPE_","_FREQ_")));run;
data &OUT.;
set &OUT.;
Stat = SCAN(_NAME_,-1,"_");
Variable = Substr(_NAME_,1,Length(_NAME_)-Length(Stat)-1);
run;
proc sort data=&OUT. ;by variable;run;
proc transpose data=&OUT. out=&OUT.(drop=_NAME_);
by Variable;
id Stat;
var Col1;
run;
%mend stat;
/* Aufruf z. B. mit */
%stat(sashelp.class,stat_class,age height weight);

Schöne Grüße

Jan