Динамический доступ к макро-переменным 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;

Другие вопросы по тегам