HAVE
是一个宽数据集,其名称存储在变量name1-name250
中。这是前两个obs和几个var:
episode name1 name2 name3 name4 name5 ...
121 DETWEILER.TJ.M BLUMBERG.MIKEY GRISWOLD.GUS.N
451 BOB.KING KID.HUSTLER FINSTER.MS PRICKLEY.PETEY GRISWOLD.GUS
...
某些名称需要更正。校正结果存储在数据集FIXES
中:
goodname badname
DETWEILER.TJ DETWEILER.TJ.M
GRISWOLD.GUS GRISWOLD.GUS.N
我只需要从badname
中出现的FIXES
中找到HAVE
,然后将其替换为goodname
。我目前在name1-name250
中每一行的数据步骤中遍历FIXES
以完成此操作:
data WANT;
set HAVE;
array name {*} name1-name250;
do i=1 to dim(name);
if name{i} = "DETWEILER.TJ.M" then name{i} = "DETWEILER.TJ";
else if name{i} = "GRISWOLD.GUS.N" then name{i} = "GRISWOLD.GUS";
/*manually add other corrections from FIXES dataset*/
else name{i} = name{i};
end;
run;
这感觉真的很低效。有什么更好的方法?
答案 0 :(得分:2)
当您进行简单的完全匹配翻译时,FORMAT是实现它的一种简单方法。您可以将“查找”数据转换为格式。
data fixes ;
input goodname :$30. badname :$30. ;
cards;
DETWEILER.TJ DETWEILER.TJ.M
GRISWOLD.GUS GRISWOLD.GUS.N
;
data format ;
retain fmtname '$FIXNAME' ;
set fixes end=eof;
rename badname=start goodname=label;
run;
proc format cntlin=format;
run;
然后只使用格式来转换名称。
data want;
set have;
array name name1-name5;
do over name;
name=put(name,$fixname30.);
end;
run;
结果:
episode name1 name2 name3 name4 name5
121 DETWEILER.TJ BLUMBERG.MIKEY GRISWOLD.GUS
451 BOB.KING KID.HUSTLER FINSTER.MS PRICKLEY.PETEY GRISWOLD.GUS