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

为什么不将数据集转换为每集/名称有一条记录,然后就可以合并(连接)两个表而不必在变量数组上循环。为什么不将数据集转换为每集/名称有一条记录,然后就可以合并(连接)两个表而不必在变量数组上循环。