replace - 基于 SAS 中的查找表修改字符变量内容
问题描述
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
from并将它们替换为. 我目前在每一行的数据步骤中循环以完成此操作: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;
这感觉真的很没效率。有什么更好的方法?
解决方案
当您有一个简单的完全匹配翻译时,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
推荐阅读
- google-apps-script - Google Apps 脚本 - 循环日期
- php - Laravel - 从字符串上传 PDF
- sql-server - SQL Server 收缩文件因 tempdb 充满活动事务而失败
- compression - vlc:从命令行将mov转换和压缩为mp4的参数
- python - 使用正则表达式替换部分字符串
- python - 如何在 Keras 网络中创建重复结构?
- wordpress - 是否有可能在 Wordpress 中用完 ID 号?
- amazon-web-services - 如何在 ECS 任务定义中下达命令
- google-cloud-shell - 谷歌“Open In Cloud Shell”坏了?
- google-sheets - 有谁可以帮我弄清楚如何在谷歌表格中显示....