用于获取员工经理汇总(递归)的 SAS 代码

问题描述 投票:0回答:1

数据

Employee Name, Manager Name
Rajiv Bajaj, Panu Thai
Panu Thai, Bob Silvers
Yi Chen, Bob Silvers
Ethan Ocampo, Bob Silvers
Bob Silvers, Dan Shak
Leo Bel, James Mane
Mamie Qwong, James Mane
James Mane, Dan Shak
Dan Shak, George Castillo

我希望将所有个人汇总到每个经理处并获得如下输出:

Manager, Subordinate
George Castillo, Dan Shak
George Castillo, Bob Silvers
George Castillo, James Mane
George Castillo, Panu Thai
George Castillo, Yi Chen
George Castillo, Rajiv Bajaj
George Castillo, Ethan Ocampo
George Castillo, Leo Bel
George Castillo, Mamie Qwong
Dan Shak, Bob Silvers
Dan Shak, James Mane
Dan Shak, Panu Thai
Dan Shak, Yi Chen
Dan Shak, Rajiv Bajaj
Dan Shak, Ethan Ocampo
Dan Shak, Leo Bel
Dan Shak, Mamie Qwong
James Mane, Leo Bel
James Mane, Mamie Qwong
Bob Silvers, Rajiv Bajaj
Bob Silvers, Panu Thai
Bob Silvers, Yi Chen
Bob Silvers, Ethan Ocampo
Panu Thai, Rajiv Bajaj

我可以获取 SAS 代码将这些假数据作为数据集写入,然后使用递归来获取汇总到每个经理的所有员工吗?

data employees;
    input Employee $ Manager $;
    datalines;
    ...
    ;
run;

不知道如何继续前进...

recursion sas
1个回答
0
投票

使用 HASH 对象应该很简单。 将数据加载到哈希中。 然后读取数据并为每个员工输出观察结果和所有主管。

data want(rename=(manager=supervisor));
  if _n_=1 then do;
    declare hash h(dataset:'have');
    h.definekey('employee');
    h.definedata('manager');
    h.definedone();
  end;
  set have ;
  output;
  do while(0=h.find(key:manager));
    output;
  end;
run;

如果您有混乱的数据,您可能需要添加逻辑来检测循环。检测循环的一种简单方法是,如果您尝试为员工添加比原始数据集中的观察结果更多的主管。

data want(rename=(manager=supervisor));
  if _n_=1 then do;
    declare hash h(dataset:'have');
    h.definekey('employee');
    h.definedata('manager');
    h.definedone();
  end;
  set have nobs=nobs;
  output;
  do _N_=1 to nobs while(0=h.find(key:manager));
    output;
  end;
  if _n_ > nobs then do;
    put 'ERROR: Cycle detected.';
    abort;
  end;
run;
© www.soinside.com 2019 - 2024. All rights reserved.