#sas #sas-macro
Вопрос:
Я пытаюсь написать макрос для замены некоторого текущего кода. Текущий код выглядит следующим образом:
data _null_;
call symput('as_of_date_nbr1', put(intnx('month', today(),-1, 'E'), yymmddn.));
run;
%put amp;as_of_date_nbr1 yields 20210831
Существует значение data_null для каждого из 30 месяцев. Эта переменная затем используется в шаге данных, где инструкция
where date = amp;as_of_date_nbr1
Я хочу написать макрос, в котором переменная as_of_date_nbr будет принимать макропеременную от 1-30, а функция intnx также будет принимать макропеременную от 1-30
Так что что-то вроде этого, если возможно, в цикле
data _null_;
call symput('as_of_date_nbr.amp;macvar, put(intnx('month,today(),-amp;macvar, 'E'), yyyymmddn.))
Пока мне не везет, любые идеи будут оценены по достоинству.
Комментарии:
1. Почему? Что вы делаете с этими датами в конце концов? Честно говоря, это довольно тривиально, но я подозреваю, что в этом также нет необходимости.
2. Даты будут использоваться в качестве идентификаторов набора данных. Поэтому я буду читать из одного большого набора данных, у которого есть дата индекса в форме yyyymdd. Из этого набора данных я хочу создать отдельные наборы данных по дате.
3. Зачем вы создаете отдельные наборы данных? обычно в SAS это неправильный подход, если только у вас где-то буквально не заканчивается оперативная память? Групповая обработка учитывает разные даты/месяцы.
4. Потому что SAS, насколько я знаю, не допускает разделов
5. Обычно это не требуется в SAS, так как он обрабатывает данные строка за строкой, и именно здесь вступает в игру групповая обработка.
Ответ №1:
Сначала начните с попытки создать набор данных с необходимыми 30 датами.
data demo;
do i=1 to 30;
var_name=catt('month', put(i, z2. -l));
var_value=intnx('month', today(), -1*i, 'e');
format var_value yymmddn8.;
output;
end;
run;
Как только вы убедитесь, что это правильно, вы можете добавить строку CALL SYMPTUX для создания макропеременных.
call symputx(var_name, put(var_value, yymmddn8.), 'g');
В зависимости от того, что вы делаете в целом, вы можете изучить ВЫПОЛНЕНИЕ ВЫЗОВА. Например, если бы вы зацикливали макрос с этими значениями вместо вызова symputx, вы могли бы использовать функцию CALL EXECUTE (), чтобы просто вызвать макрос напрямую со значениями.
Итак, если бы у вас был макрос под названием %фильтр, подобный этому:
%macro filter(date_param);
sas code
%mend;
Вместо этого вы могли бы назвать это следующим образом:
call execute(catt('%filter_data(', put(var_value, yymmddn8.), ');'));
Все вместе это было бы примерно так:
data demo;
do i=1 to 30;
var_name=catt('month', put(i, z2. -l));
var_value=intnx('month', today(), -1*i, 'e');
format var_value yymmddn8.;
call symputx(var_name, put(var_value, yymmddn8.), 'g');
*call execute(catt('%filter_data(', put(var_value, yymmddn8.), ');'));
output;
end;
run;
*check macro variables created properly;
%put amp;month01.;
%put amp;month15.;
%put amp;month30.;