根据 SAS 中的查找 table 修改字符变量内容
modifying character variable contents based on lookup table in SAS
HAVE
是一个宽数据集,名称存储在变量 name1-name250
中。这是前两个obs和几个vars:
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
我只需要从 FIXES
中找到出现在 HAVE
中的 badname
并将它们替换为 goodname
。我目前在 FIXES
中的每一行的数据步骤中循环遍历 name1-name250
以完成此操作:
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;
这感觉真的很低效。什么是更好的方法?
当您有像这样的简单精确匹配翻译时,FORMAT 是实现它的简单方法。您可以将 "lookup" 数据转换成一种格式。
data fixes ;
input goodname :. badname :. ;
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
HAVE
是一个宽数据集,名称存储在变量 name1-name250
中。这是前两个obs和几个vars:
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
我只需要从 FIXES
中找到出现在 HAVE
中的 badname
并将它们替换为 goodname
。我目前在 FIXES
中的每一行的数据步骤中循环遍历 name1-name250
以完成此操作:
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;
这感觉真的很低效。什么是更好的方法?
当您有像这样的简单精确匹配翻译时,FORMAT 是实现它的简单方法。您可以将 "lookup" 数据转换成一种格式。
data fixes ;
input goodname :. badname :. ;
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