Я ищу способ создать строковую переменную, содержащую определенные значения набора данных, при прохождении этапа данных.
Пример набора данных work.test:
AddToStringYN Value
Y One
Y Two
N Three
Y Four
N Five
В итоге переменная будет выглядеть так: OneTwoFour (или даже лучше FourTwoOne). Это выглядит так просто, но я не могу найти способ сделать это. Еще я пробовал работать с такими макропеременными:
%let stringvar=;
Data _null_;
set work.test;
if AddToStringYN = "Y" then do;
call symput('stringvar',"&stringvar" || strip(value));
end;
Run;
Но это дает:
GLOBAL STRINGVAR Four
Так что я получаю только последнее значение. Я понимаю, что это должно быть из-за моего неправильного понимания этого макроса, но я не понимаю, почему в переменной есть только последнее значение. Я думал, что это был только последний раз, когда симпут был вызван, что он действительно был запущен или что-то в этом роде, но потом, когда я настраиваю код на:
%let stringvar=;
Data _null_;
set work.test;
if AddToStringYN = "Y" then do;
call symput('stringvar'||strip(value),"&stringvar" || strip(value));
end;
Run;
Тогда я получаю их все:
GLOBAL STRINGVARONE One
GLOBAL STRINGVARTWO Two
GLOBAL STRINGVARFOUR Four
Итак, мое последнее предположение заключается в том, что при прохождении этапа данных строка 'call symput ...' фактически добавляется в макропроцессор, где "& stringvar" уже заменен, и только после последнего оператора все они выполняются.
Это хорошее предположение или есть другое объяснение? И вернемся к исходному вопросу: есть ли простой способ добиться этого (имея желаемую переменную)?