如何计算SAS中两个不同列表中相同项目的数量

如何计算SAS中两个不同列表中相同项目的数量,sas,Sas,我正在寻找计算两家公司共有高管人数的最佳方法。目前,数据的安排使得每行包含两个公司ID和每个公司董事会成员的标识符列表 目前,我已经通过使用扫描函数循环第一个列表中的每个项目,然后使用索引函数将项目与第二个列表进行比较,从而获得了所需的内容。当规模扩大到几十名高管和数亿对高管时,这是非常缓慢和低效的 下面是一个简单的工作示例。该示例不返回第一对的匹配项,第二对返回1个匹配项,第三对返回2个匹配项 data test1; INPUT year idfirm1 idfirm2 lis

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

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

下面是一个简单的工作示例。该示例不返回第一对的匹配项,第二对返回1个匹配项,第三对返回2个匹配项

    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保留为数字、宽、长等),以最好地统计重叠的管理人员的数量

这个问题可能有点过于宽泛,因为你可能有无限的方法来解决实际问题。但是,我会让我的方式来解决一般的任务

解决这一问题的一种方法是将您的经理重新安排到一个更具挑战性的数据集,在该数据集中,每个
公司和
年度都有
经理。通过这样做,您可以使用
左外部联接
来获得每个管理器的任何重叠。当您有重叠时,很容易计算出重叠最多的公司

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;
datawork.managers;
输入公司经理;
数据线;
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
;
跑
proc-sql;
创建视图work.manager\u重叠为
选择t1.manager、t1.year、t1.idfirm作为idfirm1、t2.idfirm作为idfirm2
从工作中
左键加入工作
在t1.year=t2.year和t1.manager=t2.manager上
其中t1.idfirm