【问题标题】:modifying character variable contents based on lookup table in SAS基于SAS中的查找表修改字符变量内容
【发布时间】:2019-04-13 22:51:15
【问题描述】:

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

我只需要从出现在HAVE 中的FIXES 中找到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;

这感觉效率很低。有什么更好的方法?

【问题讨论】:

  • 为什么不将您的数据集转换为每个剧集/名称有一条记录,然后您可以合并(连接)这两个表,而无需遍历一组变量。

标签: replace sas recode


【解决方案1】:

当您有一个简单的精确匹配翻译时,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多