Gruppen von Beobachtungen in DataSets schreiben
Hallo, Community,
mir liegen Daten von (unterschiedlich großen) Familien, durch eine ID identifiziert, im DataSet vor.
Nun sollen alle die Familien, wo eine [in der Praxis recht komplexe] Bedingung erfüllt ist, in ein Set 1, die anderen Familien ins Set 2 geschrieben werden.
Prinzipiell funktioniert es, die Daten je einer Familie in ein Array zu schreiben, den Test auf die Bedingung durchzuführen und je nach Ergebnis das Array über eine Schleife ins (txt-)File 1 bzw. 2 auszugeben. Die Textfiles müsste man zur Weiterverarbeitung wieder in DataSets einlesen.
Ich wollte diesen Zwischenschritt über txt-Files vermeiden.
Mir ist bisher nur eine recht umständliche Lösung eingefallen (s. u.), bei Ansätzen mit direktem Zugriff auf die Beobachtungen über MODIFY mit KEY-Option bin ich leider gescheitert.
Hier ist meine vorläufige Lösung:
j Nummer des Familienmitglieds (1 ... 3)
u ist eine beliebige Variable,
z wird zum Test auf die Bedingung herangezogen,
hier: z < 0.15
verteil ist ein Flag, 0: Set2, 1: Set1
*/
DATA a;
DO ID=1 TO 10;
DO j=1 TO 3;
u = floor(10*ranuni(-1));
z = ranuni(-1);
verteil=0;
OUTPUT;
END;
END;
RUN;
/* Variable 'verteil' wird auf 1 gesetzt, wenn für
irgendein Familienmitglied die Bedingung erfüllt ist
*/
DATA b;
SET a;
IF z < 0.15 THEN DO;
verteil=1;
OUTPUT;
END;
KEEP id verteil;
RUN;
/* Für MERGE wird nur je 1 Wert je Familie stehengelassen */
DATA c;
SET b;
BY ID;
IF last.id THEN OUTPUT;
RUN;
/* MERGE,
Hinweis: per Definitionem bereits nach ID sortiert
*/
DATA d (drop=_verteil);
Merge a c (rename=(verteil=_verteil));
BY ID;
IF _verteil > 0 THEN verteil=_verteil;
RUN;
/* Separate Ausgabe in Set1 bzw. 2
je nach Wert der Variable 'verteil'
*/
DATA set1 set2;
SET d;
IF verteil=1 THEN OUTPUT set1;
ELSE IF verteil=0 THEN OUTPUT set2;
RUN;
Hat jemand noch eine einfachere Idee? Auf Ihre Vorschläge bin ich gespannt.
Freundliche Grüße
Meinhard Mende
