Попытка написать макрос для чтения данных за 24 месяца с помощью yyyymmdd

#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.;