Sas 每个组具有多个ID值的Proc转置

Sas 每个组具有多个ID值的Proc转置,sas,transpose,Sas,Transpose,在第一个数据集中,每个员工有一个团队领导和一个主管。我可以转置,没问题 data a; input employee_id ReportsTo $ ReportsToType $12.; cards; 100 Jane Supervisor 100 Mark Team_lead 101 Max Supervisor 101 Marie Team_lead 102 Sarah Supervisor 102 Sam Team_lead ; run; proc transpose dat

在第一个数据集中,每个员工有一个团队领导和一个主管。我可以转置,没问题

data a;
input employee_id ReportsTo $ ReportsToType $12.;
cards;
100 Jane  Supervisor
100 Mark  Team_lead
101 Max   Supervisor
101 Marie Team_lead
102 Sarah Supervisor
102 Sam   Team_lead
;
run;

proc transpose data = a
                out = aTP(drop =  _:);
by employee_id;
id ReportsToType;
var ReportsTo;
run; 
/* Output */
/*employee_id   Supervisor  Team_lead */
/*100                 Jane       Mark */
/*101                  Max      Marie */
/*102                Sarah        Sam */
现在,如果一个员工可以有1到3个团队领导呢

data b;
input employee_id ReportsTo $ ReportsToType $12.;
cards;
100 Jane  Supervisor
100 Mark  Team_lead
100 Jamie Team_lead  
101 Max   Supervisor
101 Marie Team_lead
101 Satyendra Team_lead
101 Usha      Team_lead
102 Sarah Supervisor
102 Sam   Team_lead
;
run;

/* Desired Output */
/*employee_id   Supervisor  Team_lead1     Team_lead2  Team_lead3 */
/*100                 Jane        Mark          Jamie             */
/*101                  Max       Marie      Satyendra        Usha */
/*102                Sarah         Sam                            */
使用proc transpose会出现一个错误,告诉我每个组中不能有多个相同的ID变量。是否有转置程序允许这样做

ERROR: The ID value "Team_lead" occurs twice in the same BY group

您需要更改输入数据,以使其显示为递增,而不是单词
Team\u lead
的重复。。。i、 e.
团队领导1
团队领导2

您可以使用by group PROCESSION和retain语句来实现这一点:

proc sort data=b;
  by employee_id reportstotype;
run;

data want;
  set b;
  by employee_id reportstotype;
  retain cnt .;

  if first.reportstotype then do;
    cnt = 1;
  end;

  if upcase(reportsToType) eq 'TEAM_LEAD' then do;
    reportsToType = cats(reportsToType,cnt);
  end;

  cnt = cnt + 1;

run;
然后简单地调用
proc transpose
,就像您之前所做的那样:

proc transpose data=want out=trans;
  by employee_id;
  id reportsToType;
  var reportsTo;
run;

您希望结果数据如何显示?@RobertPenridge查看“所需输出”末尾的注释