Variable aus Proc means in if then Bedingung einbinden
Hallo Forum,
ich bin noch ein ziemlicher Neuling im Bereich SAS und nutze das Programm wegen meiner Diplomarbeit.
Zur Frage:
Ich möchte Zeilen aus einem Datensatz entfernen, die unter einem bestimmten Grenzwert liegen. Dieser Grenzwert soll der Median sein.
Die Berechnung des Median erfolgt über:
proc SORT
data= Modul30;
by vp_id time_duration;
run;
/*proc print
data = Modul30;
run;*/
/* Mitelwert und Median berechnen*/
proc means
data= Modul30 MEDIAN MEAN MIN MAX MAXDEC=0 ;
Label time_duration='Fixationslaenge';
VAR time_duration;
Class reg_art;
title'Alle Zusammen';
run;
In dieser Prozedur werden für die unterschiedlichen Regionsarte (reg_art) die Median berechnet.
Nun möchte ich eine if- then Anweisung schreiben, die folgermassen aussieht:
data GewichtungModul30;
set Modul_30b;
set Mark30;
if time_duration > 216 & reg_art=1 then do;
Regionsgruppe='Bild' ; end;
if time_duration >212 & reg_art=2 then do;
Regionsgruppe='Überschrift' ; end;
if time_duration >224 & reg_art=3 then do;
Regionsgruppe='Text' ; end;
if time_duration >216 & reg_art=4 then do;
Regionsgruppe='Navigationselement' ; end;
if time_duration >208 & reg_art=5 then do;
Regionsgruppe='Markierung' ; end;
if reg_art=6 then do;
Regionsgruppe='Ohne' ; end;
if url_code=1 | url_code=2 | url_code=3 | url_code=4 | url_code=5 then do;
Regionsgruppe='Kauf' ; end;
run;
Die manuelle Eingabe der Mediane als unterer Grenze funktioniert einwandfrei.Nun möchte ich aber, dass das Programm automatisch abläuft. Aus diesem Grund möchte ich die Ergebnisser der proc means (median) anstatt der 216, 212, ...,208 einsetzen.
Hat einer eine Idee wie das funktioniert?
Danke schonmal im vorraus.
- Anmelden oder Registrieren um Kommentare zu schreiben

So funktioniert es
Hallo,
du kannst dir die Mediane von PROC MEANS in ein Dataset schreiben lassen. Schau dir dazu das OUTPUT-Statement von PROC MEANS an. Anschließend kannst du diesen Dataset mit dem ursprünglichen so zusammenmischen, dass die Mediane klassenspezifisch als Konstanten den Beobachtungen zugeordnet werden.
Für das folgende Beispiel habe ich fiktive Daten verwendet und dein Programm vereinfacht.
input vp_id reg_art time_duration;
cards;
01 1 200
02 1 250
03 1 300
04 2 250
05 2 300
06 2 350
07 3 300
08 3 350
09 3 400
;
proc means
data = modul30 MEDIAN MEAN MIN MAX MAXDEC=0 ;
var time_duration;
class reg_art;
output out = modul30_mediane median = class_mediane;
run;
The MEANS Procedure Analysis Variable : time_duration N reg_art Obs Median Mean Minimum Maximum ----------------------------------------------------------------------------------- 1 3 250 250 200 300 2 3 300 300 250 350 3 3 350 350 300 400 -----------------------------------------------------------------------------------class_ Obs reg_art _TYPE_ _FREQ_ mediane 1 . 0 9 300 2 1 1 3 250 3 2 1 3 300 4 3 1 3 350merge modul30 modul30_mediane;
by reg_art;
if vp_id = . then delete; /* entsteht beim merge, weil proc means auch den Gesamtmedian für alle */
/* Beobachtungen ausgibt, der keiner einzelnen Beobachtung zugeordnet werden kann */
drop _TYPE_ _FREQ_; /* überflüssig (aus modul30_mediane) */
if time_duration > class_mediane & reg_art = 1 then Regionsgruppe = 'Bild' ;
else if time_duration > class_mediane & reg_art = 2 then Regionsgruppe = 'Überschrift' ;
else if time_duration > class_mediane & reg_art = 3 then Regionsgruppe = 'Text' ;
run;
proc print data = modul30 noobs; run;
time_ class_ vp_id reg_art duration mediane Regionsgruppe 1 1 200 250 2 1 250 250 3 1 300 250 Bild 4 2 250 300 5 2 300 300 6 2 350 300 Über 7 3 300 350 8 3 350 350 9 3 400 350 TextStatt der Wertezuweisung zu Regionsgruppe könnte natürlich ein delete stehen, um die Fälle über dem Median rauszuwerfen.