SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 760|回复: 3
打印 上一主题 下一主题

急:请问怎么求最小的差异?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2005-7-29 18:52:59 | 只看该作者

急:请问怎么求最小的差异?

我有一个数据库:里面有大公司和小公司两种,现在要寻找与大公司相匹配的小公司。匹配的标准是二者是同一个行业的,而且二者之间资产的差异最小。我想做每个大公司的资产减去同行业小公司的资产 (即一个大公司对应多个小公司)。请问怎么找到与其匹配的小公司呢?急切请教各位高手。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2005-7-29 19:53:40 | 只看该作者

进一步说明我的问题。

数据库如下:
bigfirm:

firm_id industry  assets
1            1            13.2  
2            1             14
......
5            2             15
6            2             16
....................

small firms:

firm_id industry  assets
8            1            13
9           1             10
......
10            2             13
11            2             16
....................

我需要寻找在第二个数据库中,与第一个数据库最接近资产的公司,条件是industry 相同,并把最小的差异算出来写入数据库。
例如: firm 9  最接近 firm 1

生成一个库:
firm_id industry  assets   matching_firm matching_diff
1            1            13          8                  0.2
2            1             14         9                  4
......
5            2             15
6            2             16
....................


想了半天了,不知道怎么样用循环语句算出每个大公司及其匹配的小公司。
恳求大家帮助。谢谢!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2005-7-29 23:32:59 | 只看该作者

尝试一下

data bigfirms;
input firm_id industry assets@@;
cards;
1 1 13.2
2 1 14
5 2 15
6 2 16
;
run;
proc sort; by industry;

data smallfirms;
input firm_id industry assets@@;
cards;
8 1 13
9 1 10
10 2 13
11 2 16
;
run;


%macro match_firm (big=,small= ) ;
/*step 1: 检测大公司数量,并赋值给宏变量nbigfirm;*/

data count; set &big end=final;
n+1;
if final then call symput('nbigfirm',n);
run;
%put Number of big companies: &nbigfirm;

/*step 2: 依次取出bigfirm中每一个观测(对应于一个大公司)作为子库,
并分别与smallfirms库一对多横向合并*/
data result; run;   *对存放结果的数据集初始化;
%let n=1;   *为宏变量赋初值;

%do i=1 %to &nbigfirm;
    data a; set &big.;  if _n_=&n;  obs=_n_+1; source='yes';
    call symput("n",obs);
    run;   
        proc sort data=&small. out=b (rename=(firm_id=matching_firm  assets=assets2)); by industry; run;
        data c; merge a b;by industry; matching_diff =abs(assets-assets2); if  source='yes'; run;  
    proc sort; by firm_id  matching_diff ; run;
    data match; set c; by  firm_id matching_diff;  if first.firm_id; run;  proc print; run;
        data result; set result match; if  firm_id=. then delete; run; proc print; run;
       
%end;
%mend match_firm;

%match_firm(big=bigfirms,
             small=smallfirms);
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2005-7-30 10:14:54 | 只看该作者

感谢。。。

多谢你的回复!我是个很菜的用户,要慢慢消化你的程序。Anyways, Thanks a lot!!!!!! 用完了会向你报告结果。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-3 07:33 , Processed in 0.069272 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表