изменение содержимого символьных переменных на основе таблицы поиска в SAS - PullRequest
0 голосов
/ 14 апреля 2019

HAVE - это широкий набор данных с именами, хранящимися в переменных name1-name250. Вот первые два акса и несколько переменных:

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 из 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;

Это кажется действительно неэффективным. Какой способ лучше?

1 Ответ

2 голосов
/ 14 апреля 2019

Когда у вас есть простой перевод с точным соответствием, такой как 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
...