Динамический доступ к макро-переменным SAS
Я использовал call symputx для создания списка макропеременных с Item 1 по Item N, и теперь я хочу перенести их в массив в другом шаге данных, чтобы точка 1 в массиве получала Item1, точка 2 получала Item2 и т. Д.
do j=1 to &num_OR;
rulesUsed{j}=&&Item&j;
end;
Я читал, что синтаксис двойного амперсанда - это способ ссылаться на макропеременные, как это, но я продолжаю получать всевозможные ошибки. Я уверен, что есть простой способ обойти это, но я новичок в SAS, и ни один документ, который я прочитал и который не был найден при поиске, не упомянул бы именно этот тип проблемы.
2 ответа
Короткий ответ: не делайте этого вообще. Макропеременные не являются отличным способом хранения данных, и почти всегда есть лучший способ.
Но если вам нужно, ваша проблема здесь в том, что макропеременная не может использовать переменную шага данных.
do j=1 to &num_OR;
rulesUsed{j}=&&Item&j;
end;
j
переменная шага данных, а не макропеременная, и поэтому она не &j
, Вам нужно либо:
1 - Использование symget
чтобы получить макро переменную. Это функция шага данных, которая принимает символьный аргумент обычного шага данных (например, переменную, строку " " и т. Д.) И возвращает макропеременную с этим именем. Так
rulesUsed[j] = symget(cats("item",j));
2 - Используйте макрос-цикл для извлечения макропеременной.
%do j = 1 %to &num_or;
rulesUsed[&j.] = &&item&j;
%end;
Любой из этих методов работает нормально.
Если у вас есть набор данных, как показано ниже:
data have ;
ruleno+1;
input rule $20. ;
cards;
Value1
Value2
Value3
;
Вы можете преобразовать его в широкий, используя PROC TRANSPOSE.
proc transpose data=have out=want(drop=_name_) prefix=rulesUsed ;
var rule;
id ruleno;
run;