Переименование списка переменных с использованием массивов в SAS - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь переименовать список переменных, добавив суффикс с использованием массивов. Мой код выглядит следующим образом. Сначала я сгенерировал старый и новый списки переменных как два массива. Затем я перебрал список, чтобы переименовать каждую переменную. Я получил следующее сообщение об ошибке. Что случилось? Спасибо!

%let vars = tone1 tone2 tone3 fog reading kincaid flratio spec numint 
            uncert;
%let suffix = mda;

%put &vars;
%put &suffix;


 /*Generate the variable lists*//

proc transpose data=test(obs=0) out=names;
  var &vars;
run;



 proc sql noprint ;
   select _name_, cats(_name_,'_'&suffix)
   into :old_list separated by ' ', new_list separated by ' '
   from names; 
 quit;

%put &old_list;
%put &new_list;


data test;
  set test;
  array old[*] &old_list;
  array new[*] &new_list;
  do i=1 to dim(&old_list);
    rename old[i] = new[i];
   end;
 run;

Я получил следующее сообщение об ошибке:

1597  data test;
1598    set test;
1599    array old[*] &old_list;
1600    array new[*] &new_list;
1601    do i=1 to dim(&old_list);

NOTE: Line generated by the macro variable "OLD_LIST".
1     Tone1 Tone2 Tone3 Fog Reading Kincaid FLRatio SPEC NumInt Uncert
        -----
        388
        76
1602      rename old[i] = new[i];
                -
                22
                76
ERROR 388-185: Expecting an arithmetic operator.

ERROR 76-322: Syntax error, statement will be ignored.

ERROR 22-322: Syntax error, expecting one of the following: -, :, =.

1603    end;
1604    run;

Ответы [ 2 ]

3 голосов
/ 27 апреля 2019

Функция DIM() нуждается в имени массива, а не в списке имен переменных.Оператору RENAME нужны имена переменных, а не ссылки на массивы.

Просто сгенерируйте пары OLD = NEW непосредственно в одной макропеременной, чтобы вы могли использовать ее в операторе RENAME.

proc sql noprint ;
  select catx('=',_name_, cats(_name_,"_&suffix"))
    into :rename_list separated by ' '
    from names
  ; 
quit;

proc datasets nolist lib=work;
  modify test;
  rename &rename_list;
  run;
quit;
2 голосов
/ 27 апреля 2019

rename не является динамическим исполняемым оператором. Другими словами, шаг данных во время выполнения не может добавлять или иным образом изменять вектор данных программы (pdv), который создается во время автоматической компиляции.

Вы решили подчинить TRANSPOSE роли простого получения одной строки на переменную (что действительно интересно) для манипулирования данными.

Конечной целью простого изменения имен переменных является рутинная работа с метаданными, лучше подходящая для Proc DATASETS. Переписывая весь набор данных, просто изменить имена столбцов можно с небольшими данными, но для больших наборов данных это не очень хорошая идея.

Таким образом, настоящая задача состоит в том, чтобы изменить список токенов, разделенных пробелами, на новый список элементов <token>=<newtoken>, которые можно использовать в операторе переименования.

%let renamelist = %sysfunc(prxchange(s/(\w+)\b/$1=$1&SUFFIX/,-1,&VARS));

и

proc datasets nolist lib=work;
  modify test;
  rename &renamelist;
run; quit;
...