Re: [程式] 使用SAS尋找最相近的數值
※ 引述《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
06/08 10:09, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):