Replace 在SAS中基于查找表修改字符变量内容
Replace 在SAS中基于查找表修改字符变量内容,replace,sas,recode,Replace,Sas,Recode,HAVE是一个广泛的数据集,其名称存储在变量name1-name250中。以下是前两个OB和几个VAR: episode name1 name2 name3 name4 name5 ... 121 DETWEILER.TJ.M BLUMBERG.MIKEY GRISWOLD.GUS.N 451 BOB.KING KID.HUSTLER FINSTE
HAVE
是一个广泛的数据集,其名称存储在变量name1-name250
中。以下是前两个OB和几个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
...
有些名字需要更正。更正存储在数据集修复中
:
goodname badname
DETWEILER.TJ DETWEILER.TJ.M
GRISWOLD.GUS GRISWOLD.GUS.N
我只需要从HAVE
中出现的badname
中找到FIXES
,并将其替换为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;
这感觉真的很低效。什么是更好的方法?当您有这样一个简单的精确匹配转换时,格式是实现它的简单方法。您可以将“查找”数据转换为格式
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
当您有这样一个简单的精确匹配转换时,格式是实现它的简单方法。您可以将“查找”数据转换为格式
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
为什么不将数据集转换为每集/名称有一条记录,然后就可以合并(连接)两个表而不必在变量数组上循环。为什么不将数据集转换为每集/名称有一条记录,然后就可以合并(连接)两个表而不必在变量数组上循环。