如何计算SAS

时间:2015-06-09 12:59:27

标签: sas

我正在寻找计算两家公司分享的高管人数的最佳方式。目前,数据被安排成使得每行包含两个公司ID和每个公司的每个董事会成员的标识符列表。

目前,我已经设法通过使用扫描函数循环遍历第一个列表中的每个项目然后使用索引函数将项目与第二个列表进行比较来获得我需要的内容。当扩大到数十名高管和数亿对时,这是非常缓慢和低效的。

下面是一个简单的工作示例。该示例返回第一对没有匹配,第二对没有匹配,第三对没有匹配。

    data test1;
    INPUT year idfirm1 idfirm2 list1 $17-61 list2 $63-108;
    datalines;
    2000 1001 1002 106146||110716||156790||170648||175076||185060 108178||138024||162445||166960||221521||228814
    2000 1001 1003 106146||110716||156790||170648||175076||185060 108178||138024||162445||166960||221521||106146
    2000 1001 1004 106146||110716||156790||170648||175076||185060 108178||138024||162445||166960||110716||106146
    ;
    run;

    %macro loop2;
    %do m = 1 %to 6;
    test&m=scan(list1,&m,'||');
    if test&m ^= ' ' and index(list2,strip(test&m)) > 0 then match&m = 1;
    drop test&m;
    %end;
    %mend;

    data test2; set test1;
    %loop2;
    N_overlap = sum(of match:);
    if N_overlap = . then N_overlap = 0;
    run;

可以轻松地重新排列数据(即将ID保留为数字,宽,长等),以便最好地计算重叠管理人员的数量。

1 个答案:

答案 0 :(得分:2)

对于SO来说,这个问题可能有点广泛,因为你可能有无限的方法来解决实际问题。但是,我会给出解决一般任务的方法。

解决此问题的一种方法是将您的经理重新安排到一个更具克服性的数据集,每managerfirmyear。通过此操作,您可以使用left outer join获取每个经理的任何重叠。当您有重叠时,很容易计算哪些公司重叠最多。

data work.managers;
INPUT year idfirm manager;
datalines;
2000 1001 106146
2000 1001 185060
2000 1002 108178
2000 1002 228814
2000 1003 108178
2000 1003 106146
2000 1004 108178
2000 1004 110716
2000 1004 106146
;
run;

proc sql;
create view work.manager_overlap as
select t1.manager, t1.year, t1.idfirm as idfirm1, t2.idfirm as idfirm2
from work.managers t1
left join work.managers t2
  on t1.year = t2.year and t1.manager = t2.manager
where t1.idfirm < t2.idfirm
order by t1.manager, t1.year, t1.idfirm, t2.idfirm;

proc sql;
create table work.manager_overlap_count as
select t1.idfirm1, t1.idfirm2, t1.year, count(t1.manager) as n_overlaps
from work.manager_overlap t1
group by t1.idfirm1, t1.idfirm2, t1.year
order by n_overlaps desc, t1.idfirm1, t1.idfirm2, t1.year;