每个组具有多个 ID 值的 Proc Transpose
Proc Transpose With multiple ID values per Group
在第一个数据集中,每个员工都有一个团队领导和一个主管。我可以转置没问题。
data a;
input employee_id ReportsTo $ ReportsToType .;
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 .;
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_lead
一词不会重复,而是显示它递增...即 Team_lead1
、Team_lead2
等...
可以使用by-group处理和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;
在第一个数据集中,每个员工都有一个团队领导和一个主管。我可以转置没问题。
data a;
input employee_id ReportsTo $ ReportsToType .;
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 .;
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_lead
一词不会重复,而是显示它递增...即 Team_lead1
、Team_lead2
等...
可以使用by-group处理和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;