Re: [程式] 用SAS找出排序後特定名次的值
※ 引述《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)
推
05/31 17:14, , 1F
05/31 17:14, 1F
推
06/01 11:00, , 2F
06/01 11:00, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):