Hallo zusammen, ich bräuchte ein bisschen Hilfe. Ich habe Labordaten im ldt-Format bekommen und versuche, diese gerade so aufzulösen, dass ich pro Laborprobe eine Zeile habe in der die Proben-ID und danach die Testergebnisse mit den jeweiligen Einheiten, Grenzwerten etc. kommen. Ich habe dies auch schon geschafft, allerdings für 3 Laborwerte und ohne irgendeine Form von Makro. Jetzt muss ich das für 15 Laborwerte machen und es wird Zeit, dass ich mich an den Makros versuche. Ich bin auch schon ein Stück weit gekommen, stecke jetzt aber fest und brauche Hilfe. Hier erstmal ein (gekürzter) Bespieldatensatz an dem Punkt an dem ich jetzt bin: DATA labor;
input probe testident $ ergebnis einheit $ grenzw_ind $;
put _all_;
cards;
1 Ca/S 2.04 mmol/l -
1 Cl/S 116 mmol/l +
1 TGL 217 mg/dl +
2 Ca/S 2.36 mmol/l +
2 Cl/S 101 mmol/l -
2 UA/S 6.7 mg/dl +
3 Ca/S 1.86 mmol/l -
3 Cl/S 97 mmol/l -
3 TGL 35 mg/dl -
RUN; „probe“ steht für die Proben-ID, d.h. alle Zeilen mit derselben probe gehören zu einer Serumprobe und diese sollen in eine Zeile nebeneinander geschrieben werden. Und hier will ich hin, d.h. so soll der Datensatz am Ende aussehen: Jetzt habe ich versucht, mich Schritt für Schritt dahin zu arbeiten, analog zu meinem alten Makro-freien Programm. options symbolgen;
%macro anlegen(st_test);
format &st_test._value $10.
&st_test._unit $10.
&st_test._flag_patho $5.;
%mend anlegen;
%macro merken(st_test);
retain &st_test._value;
retain &st_test._unit;
retain &st_test._flag_patho;
%mend merken;
%macro leer(st_test);
&st_test._value = "";
&st_test._unit = "";
&st_test._flag_patho = "";
%mend leer;
%macro bedingung(lim_test, st_test);
%if &testid = &lim_test %then %do;
&st_test._value = ergebnis;
&st_test._unit = einheit;
&st_test._flag_patho = grenzw_ind;
%end;
%mend bedingung;
DATA labor2;
format h_probe 5.;
set work.labor;
%anlegen (ca)
%anlegen (cl)
%anlegen (trg)
%anlegen (ua);* Darf ich den Strichpunkt hier setzen?;
if probe=h_probe then do;
%merken (ca)
%merken (cl)
%merken (trg)
%merken (ua); * Darf ich den Strichpunkt hier setzen?;
end;
else do;
%leer (ca)
%leer (cl)
%leer (trg)
%leer (ua); * Darf ich den Strichpunkt hier setzen?;
end;
/* An dieser Stelle müsste der Aufruf des Makros „bedingung“ erfolgen, a la…*/
%bedingung (Ca/S, ca);
%bedingung (Cl/S, cl);
%bedingung (TRG, trg);
%bedingung (UA/S, ua);
/*… allerdings mit der Zuweisung einer laufende Variablen (testident) statt der gerade gezeigten Aufrufe. Dass es so nicht funktionieren kann, ist mir klar, weil die Makros vor dem DataStep ausgeführt werden. Aber wie kann’s funktionieren? Mit call symputx? Aber wie? */
call symputx ('testid', testident); /* call symputx: Ausführung zur Laufzeit des DataSteps*/
h_probe=probe;
retain h_probe;
RUN; Kann mir jemand ein wenig auf die Sprünge helfen? Vielen Dank und viele Grüße Barbara
... View more