LISTSERV at the University of Georgia
Menubar Imagemap
Home Browse Manage Request Manuals Register
Previous messageNext messagePrevious in topicNext in topicPrevious by same authorNext by same authorPrevious page (October 1997, week 1)Back to main SAS-L pageJoin or leave SAS-L (or change settings)ReplyPost a new messageSearchProportional fontNon-proportional font
Date:         Thu, 2 Oct 1997 09:40:22 -0700
Reply-To:     h12388vit@ella.hu
Sender:       "SAS(r) Discussion" <SAS-L@UGA.CC.UGA.EDU>
From:         VITRAI Jozsef <h12388vit@ELLA.HU>
Organization: OPNI
Subject:      mean AND median: final version
Content-Type: text/plain; charset=us-ascii

Last Wenstday (24 September) Ian Whitlock <whitloi1@Westat.com> posted a version of a macro dealing with univariate statistics for many variable. Here is his following improved version that handles the labels, too:

*****************************************************************************

%macro unistats ( data = &syslast , out = _data_ , vars = _numeric_ , stats = n mean std p5 p95 median q1 q3 normal min max ) ;

%local i j stat var stdstats nstats lib mem n mean std p5 p95 median q1 q3 normal min max ;

%let stdstats = N MEAN STD P5 P95 MEDIAN Q1 Q3 NORMAL MIN MAX ; %let n = N ; %let mean = Mean ; %let std = Standard deviation ; %let p5 = %nrstr(Percentile 5% ) ; %let p95 = %nrstr(Percentile 95% ) ; %let median = Median ; %let q1 = Lower quartile ; %let q3 = Upper quartile ; %let normal = Normality ; %let min = Min ; %let max = Max ;

%if %qscan ( &out , 2 , . ) = %then %do ; %let lib = WORK ; %let mem = &out ; %end ; %else %do ; %let lib = %qscan ( &out , 1 , . ) ; %let mem = %qscan ( &out , 2 , . ) ; %end ;

proc univariate data=&data normal noprint ; var &vars ; output out = __u1

%let i = 1 ; %let stat = %qscan ( &stats , &i ) ; %do %while ( &stat ^= ) ;

&stat =

%let i = %sysfunc ( putn ( &i , z2. ) ) ; %let j = 1 ; %let var = %qscan ( &vars , &j ) ; %do %while ( &var ^= ) ; %let j = %sysfunc ( putn ( &j , z3. ) ) ; v&j._s&i. %let j = %eval ( &j + 1 ) ; %let var = %qscan ( &vars , &j ) ; %end ; %let i = %eval ( &i + 1 ) ; %let stat = %qscan ( &stats , &i ) ; %end ; %let nstats = %eval ( &i - 1 ) ; ; run ;

proc transpose data=__u1 out=__u2 ; run;

proc sort data=__u2; by _name_ ; run ;

data __u3 ; length vname sname $ 8 ; set __u2 ; vname = resolve ( '%scan(&vars,' || substr(_name_, 2, 3) || ')' ) ;

sname = resolve ( '%scan(&stats,' || substr(_name_, 7) || ')' ) ; run ;

proc transpose data = __u3 out = &out ( drop = _name_ ) ; by vname ; id sname ; var col1 ; run ;

%if %upcase ( &mem ) = _DATA_ %then %let mem = %qscan ( &syslast , 2 , . ) ;

proc datasets lib = work nolist ; delete __u: ; %if &lib = WORK %then %do ; modify &mem ; label %do i = 1 %to &nstats ; %let stat = %upcase ( %qscan ( &stats , &i ) ) ; %if %index ( &stdstats , &stat ) %then &stat = &&&stat ; %end ; ; %end ; %else %do ; quit ; proc datasets lib = &lib nolist ; modify &mem ; label %do i = 1 %to &nstats ; %let stat = %upcase ( %qscan ( &stats , &i ) ) ;

%if %index ( &stdstats , &stat ) %then &stat = &&&stat ; %end ; ; %end ; quit ;

%mend unistats ;

data temp0; do i=1 to 1000; x=normal(-1); y=normal(-1); z=normal(-1); output; end; run ;

options mprint ; %unistats ( vars = x y z , data = temp0 , stats = n mean min max std p5 p95)

proc print label ; run ;


Back to: Top of message | Previous page | Main SAS-L page