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查看“所需输出”末尾的注释