这是一个只涉及两个步骤的解决方案...只需确保您的数据首先按 id 排序(伤害列不需要排序)。
首先,创建一个包含伤害列表的宏变量
proc sql noprint;
select distinct injury
into :injuries separated by " "
from have
order by injury;
quit;
那么,让RETAIN 施展魔法吧——无需换位!
data want(drop=i injury);
set have;
by id;
format &injuries 1.;
retain &injuries;
array injuries(*) &injuries;
if first.id then do i = 1 to dim(injuries);
injuries(i) = 0;
end;
do i = 1 to dim(injuries);
if injury = scan("&injuries",i) then injuries(i) = 1;
end;
if last.id then output;
run;
编辑
根据 OP 在 cmets 中提出的问题,以下是我们如何使用代码和标签来表示伤害。它可以直接在最后一个数据步骤中使用label 语句完成,但为了尽量减少硬编码,我假设标签被输入到 sas 数据集中。
1 - 定义标签:
data myLabels;
infile datalines dlm="|" truncover;
informat injury $12. labl $24.;
input injury labl;
datalines;
S460|Acute meniscal tear, medial
S520|Head trauma
;
2 - 向现有 proc sql 步骤添加新查询以准备标签分配。
proc sql noprint;
/* Existing query */
select distinct injury
into :injuries separated by " "
from have
order by injury;
/* New query */
select catx("=",injury,quote(trim(labl)))
into :labls separated by " "
from myLabels;
quit;
3 - 然后,在data want 步骤的末尾,添加一个label 语句。
data want(drop=i injury);
set have;
by id;
/* ...same as before... */
* Add labels;
label &labls;
run;
应该这样做!