作者imaltar (..)
站内Statistics
标题Re: [程式] 用SAS找出排序後特定名次的值
时间Mon May 31 16:25:42 2010
※ 引述《pinpon (妈~我会飞耶~)》之铭言:
: ------------------------------------------------------------------------
: [软体程式类别]:
: SAS
: [程式问题]:
: 资料处理
: [软体熟悉度]:
: 中(3个月到1年)
: [问题叙述]:
: 各位好
: 我有资料如下
: a b c d
: .1 .3 .1 .2
: .3 .5 .6 .7
: .8 .2 .3 .4
: .8 .3 .5 .1
: .6 .5 .9 .9
: .5 .5 .4 .4
: 现在想做的事是
: 将各变数的值各自加总後,找出各变数降幂排序後排名为该加总值的值
: 如a变数加总後为3.1,将a变数降幂排序後得到第4名为0.5 (名次如有小数点无条件进位)
: 再以0.5为准,将a变数的值重新分类,>=0.5者为1,<0.5者为0,如下
: a a2
: .1 0
: .3 0
: .8 1
: .8 1
: .6 1
: .5 1
: 目前想不出来怎麽做...
: 虽然可以用excel做到,可是我有几百项变数,每项都要做同样的事...
: 请问有没有神人知道怎麽用sas做这样的事?
: 还是说可以用其他软体来做?
: 先谢谢了...
: -----------------------------------------------------------------------------
我先假设你的资料名叫做test
data test;input a b c d;
cards;
.1 .3 .1 .2
.3 .5 .6 .7
.8 .2 .3 .4
.8 .3 .5 .1
.6 .5 .9 .9
.5 .5 .4 .4
;
run;
再根据下面的%macro处理你要的资料,我原本想用proc rank做排名,但是我不知道
你排名相等时是怎麽排,取平均还是取最大值或最小值,所以我就用proc sort来做
排名的动作
%macro rank(data=,var=);
/*proc rank data=&data. descending ties=low out=test1;
var &var. ;
ranks r_&var.;
run; */
/*先排序取rank*/
proc sort data=&data.;by descending &var.;
data test1;set &data.;r_&var.+1; run;
/*加总变项的值*/
proc univariate data=test1 noprint;
var &var. ;
output out=test2 sum=s_&var.;
run;
/*取加总值=rank时,所对应的变项的值*/
data test2;set test2;
call symput("s_&var.",ceil(s_&var.));run;
data temp;set test1;if r_&var.=&&s_&var. then output;keep &var.;run;
/*将所对应的值和原本变数下的值进行比较,>= 令为1 , <则令为0*/
data temp;set temp;call symput("n_&var.",&var.);run;
data &data.;set test1;if &var. ge &&n_&var. then &var.1=1;else &var.1=0;run;
%mend;
%rank(data=test,var=a);
%rank(data=test,var=b);
%rank(data=test,var=c);
%rank(data=test,var=d);
data就是输入你资料的名称,var就是你要做排名的变数名称,你的例子有a b c d
四个变数,所以%rank就列了四个,只是变数很多的话你就要辛苦点了,最後你要的
新变数会产生在你原始的资料里面~~~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.43.112.107
※ 编辑: imaltar 来自: 114.43.112.107 (05/31 16:43)
1F:推 pinpon:太感谢了!!我会先试看看再上来回报结果~ 05/31 17:14
2F:推 pinpon:已成功 谢谢你~ 06/01 11:00