Re: [程式] 用SAS找出排序後特定名次的值

看板Statistics作者 (..)時間15年前 (2010/05/31 16:25), 編輯推噓2(200)
留言2則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《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
文章代碼(AID): #1C0tA9MV (Statistics)
文章代碼(AID): #1C0tA9MV (Statistics)