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 ;