作者imaltar (..)
站内Statistics
标题Re: [程式] 使用SAS寻找最相近的数值
时间Fri Jun 4 18:34:31 2010
※ 引述《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
1F:推 rong7325:好强喔 天啊! 06/04 19:50
2F:推 viel:感谢~问题已经解决了:) 06/04 21:34
3F:→ ASD332:两个资料档数目要相同有特别的目的吗 @@? 06/04 23:48
原本一开始我是用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)
4F:→ imaltar:试过成功了 不过没人会看这篇吧XD 06/08 10:09