*
; /* From: Ismail Parsa;Reply-To: Ismail Parsa Newsgroups: comp.soft-sys.sas Subject: CODE CORRECTION (WAS: NEED TO RANK BASED ON A WEIGHT VARIABLE) Date: Wed, 6 Sep 1995 17:14:39 EST Message-ID: <9509062214.AA17098@dragon.epsilon.com> The macro is essentially implementing 'proc rank group=QUANTILES'with a weight statement. */ %macro rank ( dsn = /* data set name */ , wgt = /* weight variable */ , var = /* analysis variable */ , rank = /* name for the rank variable */ , quantile = /* 5 for quintiles 10 for deciles 20 for duo or demi deciles 100 for percentiles */ ) ; data _NULL_ ; set &DSN end=last ; sumofwgt + &wgt ; if last then call symput ('SUM', trim(left(put(sumofwgt, best.)))) ; run ; proc sort data = &DSN ; by descending &VAR ; run ; data &DSN ; set &DSN ; drop sumofwgt ; sumofwgt + &WGT ; &rank = 0 ; do i = 1 to ( &quantile - 1 ) ; if ( ( &rank = 0 ) and ( sumofwgt le (( &SUM*i)/&quantile ) ) ) then &rank = i ; end ; if (&rank = 0) then &rank = &quantile ; drop i ; label &rank = "Rank for the Variable: &VAR." ; run ; %mend rank ; *