Re: [程式] 使用SAS尋找最相近的數值

看板Statistics作者 (..)時間15年前 (2010/06/04 18:34), 編輯推噓2(202)
留言4則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《viel (造啦~塞狼)》之銘言: : [軟體程式類別]:SAS : [程式問題]:想請問一下大家,如何利用SAS尋找最相近的數值 : [軟體熟悉度]:中(3個月到1年) : [問題敘述]: : 現在想要計算公司的異常報酬,但是使用的對比公司是用規模最相近的 : 不知道類似這種問題該如何解決... : 因可能無法找到規模相同,而且資料量也蠻大的~ : [範例]: : 檔案A 檔案B : CUSIP SIZE TCUSIP SIZE : -------------------- ---------------- : 000001 1230.5 000011 1110.7 : 000002 1001.3 000022 340.8 : 000003 650.4 000033 500.9 : 想要的結果 : CUSIP SIZE TCUSIP SIZE : ---------------------------- : 000001 1230.5 000011 1110.7 : 000002 1001.3 000011 1110.7 : 000003 650.4 000033 500.9 雖然是比較之前的文章 不過看到時覺得很有趣 就依照你的目的寫了一個%macro 不過我是假設你兩個資料的數目都相同去寫的 data1是你的檔案A data2是你的檔案B outdata是最後希望得到的結果資料 先根據你的例子假設兩個資料 data a;input cusip $ size; cards; 000001 1230.5 000002 1001.3 000003 650.4 ; data b;input tcusip $ size; cards; 000011 1110.7 000022 340.8 000033 500.9 ; run; 以下就是根據a資料的每一個cusip的size都跟b資料所有的size去比 取差異最小的 %macro compare(data1=,data2=,outdata=); data &data1.;set a;id+1; data &data2.;set b(rename=(size=b_size));id+1; data c;merge &data1. &data2.;by id;run; proc sql noprint;select max(id) into: n from c;quit; data &outdata.;set _null_; %do i=1 %to &n.; data temp_a;set c(where=(id=&i.));call symput('size',size);keep cusip size id; data c;set c;size_dif=abs(b_size-&size.);run; proc rank data=c ties=low out=d; var size_dif; ranks r_dif; run; data temp_b;set d(where=(r_dif=1));keep id tcusip b_size r_dif; data temp;merge temp_a temp_b;drop id r_dif;run; data &outdata.;set &outdata. temp;run; %end; %mend; %compare(data1=a,data2=b,outdata=out); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.43.126.88

06/04 19:50, , 1F
好強喔 天啊!
06/04 19:50, 1F

06/04 21:34, , 2F
感謝~問題已經解決了:)
06/04 21:34, 2F

06/04 23:48, , 3F
兩個資料檔數目要相同有特別的目的嗎 @@?
06/04 23:48, 3F
原本一開始我是用merge合併兩組資料來處理的,不過經你提醒, 只要根據檔案A的個數去一個個試就好,所以我再改了一下,這樣就不用管兩個資料量 有沒有差了 %macro compare(data1=,data2=,outdata=); data a;set &data1.;id+1; proc sql noprint;select max(id) into: n from a;quit; data &outdata.;set _null_; %do i=1 %to &n.; data temp_a;set a(where=(id=&i.));call symput('size',size);keep cusip size id; data b;set &data2.;size_dif=abs(size-&size.);run; proc rank data=b ties=low out=d; var size_dif; ranks r_dif; run; data temp_b;set d(where=(r_dif=1) rename=(size=b_size));keep r_dif tcusip b_size ; data temp;merge temp_a temp_b;drop id r_dif;run; data &outdata.;set &outdata. temp;run; %end; %mend; %compare(data1=a,data2=b,outdata=out); 我是剛剛想好改的,手邊的電腦沒SAS所以沒去實際執行,不過應該是可以的XD 至於原PO就參考看看就好XD~~~ ※ 編輯: imaltar 來自: 123.193.72.239 (06/05 00:50)

06/08 10:09, , 4F
試過成功了 不過沒人會看這篇吧XD
06/08 10:09, 4F
文章代碼(AID): #1C2DQwas (Statistics)
文章代碼(AID): #1C2DQwas (Statistics)