Получить значения макропеременных в таблице 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;