Получить значения макропеременных в таблице SAS

У меня есть набор входных макропеременных в SAS. Они являются динамическими и генерируются на основе выбора пользователя в хранимом процессе sas.

For example:There are 10 input values 1 to 10.
The name of the macro variable is VAR_. If a user selects 2,5,7 then 4 macro variables are created. 
&VAR_0=3;
&VAR_=2;
&VAR_1=5;
&VAR_2=7;

Первый с суффиксом 0 предоставляет счетчик. Следующие 3 предоставляют значения.

Примечание. Если пользователь выбирает только одно значение, создается только одна макропеременная. Например, если пользователь выбирает 9, тогда &var_=9; будет создан. Там не будет никакой переменной макроса count. Я пытаюсь создать таблицу sas, используя эти переменные.

Так должно быть

OBS    VAR
-----------
1      2
2      5
3      7
-----------

Это то, что я пытался. Не уверен, что это правильный подход. Это не дает мне окончательного решения, но я могу хотя бы получить имя макропеременных в таблице. Как я могу получить их значения?

data tbl1;
do I=1 to &var_0;
VAR=CAT('&VAR_',I-1);
OUTPUT;
END;
RUN;
PROC SQL;
CREATE TABLE TBL2 AS 
SELECT I,
CASE WHEN VAR= '&VAR_0' THEN '&VAR_' ELSE VAR END AS VAR
from TBL1;
QUIT;

Спасибо за помощь.

сойка

3 ответа

Решение

Я не понимаю вашу схему нумерации и рекомендую изменить ее, если можете; &var_ Переменная очень сбивает с толку.

Во всяком случае, самый простой способ сделать это SYMGET, Это возвращает значение из таблицы символов макросов, которую вы можете указать во время выполнения.

%let VAR_0=3;
%let VAR_=2;
%let VAR_1=5;
%let VAR_2=7;

data want;  
  do obs = 1 to &var_0.;
    var = input(symget(cats('VAR_',ifc(obs=1,'',put(obs-1,2.)))),2.);
    output;
  end;
run;

Я думаю, что реальная проблема заключается в противоречивом поведении хранимого процесса. Это только создает 0 а также 1 переменная, когда есть несколько выборов. Я думаю, что ваш пример немного не в порядке. Если значение VAR_0 три, то их должно быть VAR_3 макропеременная. Также ценность VAR_ а также VAR_1 должен быть установлен на то же самое.

Чтобы исправить это в прошлом, я сделал что-то вроде этого. Сначала давайте назначим имя параметра макропеременной, чтобы код можно было повторно использовать для других программ.

%let name=VAR_;

Затем сначала убедитесь, что существуют минимальные макропеременные.

%global &name &name.0 &name.1 ;

Затем убедитесь, что у вас есть счет, установив 0 переменная в 1, когда он пуст.

%let &name.0 = %scan(&&&name.0 1,1);

Затем убедитесь, что у вас есть 1 переменная. Так как он должен иметь то же значение, что и макрос-переменная без суффикса, просто переназначьте его.

%let &name.1 = &&&name ;

Теперь ваш шаг данных проще.

data want ;
  length var $32 value $200 ;
  do i=1 to &&&name.0 ;
    var=cats(symget('name'),i);
    value=symget(var);
    output;
  end;
run;

SAS услужливо хранит их в таблице уже для вас, вам просто нужно разобрать те, которые вы хотите. Таблица называется SASHELP.VMACRO или DICTIONARY.MACROS.

Вот пример:

%let var=1;
%let var2=3;
%let var4=5;

proc sql;
create table want as
select * from sashelp.vmacro
where name like 'VAR%';
quit;

proc print data=want;
run;
Другие вопросы по тегам