SAS:在整组观察中重新编码变量,包括覆盖选项

时间:2014-05-01 01:20:11

标签: sas

我有一个包含患者ID和种族的大型SAS数据集。这是一个纵向数据集,其中每个观察代表对医院的访问。有许多观察结果缺少种族信息,但对同一患者ID的其他访问已经显示出种族。我使用下面的代码来解决对于缺少种族的给定患者ID的任何观察,只要另一次访问具有该信息:

data need;
   do until (last.id);
      set have;
      by id;
      if not missing(race) then newrace=race;
      if missing(race) then race=newrace;
      output;
   end;
run;

我的问题是 - 如何记录患者在多个选项中有多个种族?我如何确定一个比其他人更具优势/压倒性(对于患者342,有3个种族= 2的障碍和2个种族= 4的障碍;我们希望任何种族= 4的指示来确定newrace = 4适用于患者342的所有患者。

谢谢!

2 个答案:

答案 0 :(得分:0)

这个答案假定4是最重要的竞赛,并且如果一个id有多个种族但其中一个是4,所有种族值都被替换为4.如果给定的id有多个种族没有其中4这个代码基本上选择了哪一个将随机替换缺失值。

data races (drop=race);
do until (last.id);
set have;
by id;
if newrace ne 4 then newrace = race;
end;
output;
run;

data need (drop=newrace);
merge have races;
by id;
if missing(race) then race=newrace;
if newrace = 4 then race = 4;
run;

第一部分创建一个数据集“种族”,其中种族应该替换每个id的缺失。第二个将其合并到原始集中,并用“种族”中的种族替换缺失。

答案 1 :(得分:0)

我这样做的方法是为患者ID创建一种格式。这不仅可以解决您的直接问题,而且可以在其他步骤中使用,因为它可以在过程中使用。

data for_fmt;
set have;
by id;
retain label;
retain fmtname 'IDRACEF';
start=id;
if race=4 then label=4; *or you could have label='Hispanic', also - could use this to convert to character strings;
else label=coalesce(label,race); *otherwise only change race if label is missing;
if last.id then output;
keep start label fmtname hlo;
if _n_=1 then do;
 start=.;
 label=.; *or 'MISSING' or something else indicating a nonmatch;
 hlo='o';
 output;
end;
run;

proc format cntlin=for_fmt;
quit;

然后,您可以使用IDRACEF.格式,在列上使用format(例如在proc means中)或使用put语句。