SAS: введите конкретное значение для параметра для макропрограммы

#parameters #sas #macros

#параметры #sas #макросы

Вопрос:

Я хотел бы создать макропрограмму для следующей цели:

У меня есть набор данных (abcsales), который имеет следующие переменные: идентификатор, дата продажи, месяц, страна и т.д.

Я хотел бы, чтобы статистика переменной sales отображалась путем ввода месяца и страны в моей макропрограмме:

Я сделал следующее:

 %MACRO create_sales_month_country(data,month,country);

    proc univariate data=amp;data;
    class amp;month amp;country;
    var sales;
    run;

%MEND;
 

но, делая это, он вернет продажи по всем странам с разными месяцами.

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

Я знаю, что я мог бы использовать переменные keywords в своей макропрограмме, например:

%МАКРОС create_sales_month_country(данные, месяц = «апрель», страна = «Мексика»);

но мне нужно каждый раз изменять значение параметра, чтобы получить статистику другой страны.

Мне интересно, есть ли «оператор where», который я мог бы использовать в «одномерном процессе», который позволит мне отсортировать набор данных по конкретному месяцу и стране, а затем вывести статистику, которую я хотел бы иметь для желаемой страны с желаемым месяцем.

Я попробовал следующее:

 %MACRO create_sales_month_country(data,month,country);

    proc univariate data=amp;data;
    class amp;month amp;country;
    var sales;
    where month = "amp;month" and country = "amp;country"
    run;

%MEND;
 

Но приведенный выше код вообще не работает.

Не могли бы вы помочь мне найти решение с кодом, которое могло бы достичь того, что я хотел бы сделать?

Спасибо!

Комментарии:

1. Ваш второй набор кода в основном правильный, однако в операторе WHERE отсутствует точка с запятой, и вы не показываете, в чем заключается ошибка. При написании кода макроса сначала протестируйте его без макроса, а затем преобразуйте его в макрос.

2. Пожалуйста, опубликуйте журнал вызова второго кода, чтобы мы поняли, что происходит. Используйте параметры отладки SAS options mprint symbolgen; , затем вызовите макрос %create_sales_month_country(myData, 1, Canada); и опубликуйте полный журнал, чтобы помочь нам помочь вам отладить любые проблемы.

Ответ №1:

Сначала спланируйте, какой код вы хотите, чтобы макрос генерировал. Вы хотите выбрать только один МЕСЯЦ и комбинацию СТРАН? Итак, код, подобный:

 proc univariate data=my_data;
  where month = "January" and country = "United States" ;
  class month country;
  var sales;
run;
 

Затем решите, что вы хотите потребовать от пользователя передать. Вы хотите, чтобы они передавали строку January или строку "January" ? Для первого ваш макрос будет выглядеть так:

 %macro create_sales_month_country(data,month,country);
proc univariate data=amp;data;
  where month = "amp;month" and country = "amp;country" ;
  class month country;
  var sales;
run;
%mend ;
 

И вызов будет выглядеть так

 %create_sales_month_country(my_data,January,United States)
 

Обратите внимание, что вам разрешено включать имена параметров в вызов макроса, даже если макрос определен, так что вам не нужно этого делать.

 %create_sales_month_country(data=my_data,month=January,country=United States)
 

Обратите внимание, что это будет работать, когда МЕСЯЦ и СТРАНА являются символьными строками, как в моем примере без макроса. Если МЕСЯЦ и СТРАНА являются числовыми переменными, не добавляйте кавычки.

Альтернативой является заставить вызывающего абонента передать действительный код SAS для требуемого значения. Это полезно, если вы хотите использовать оператор IN, чтобы позволить им выбирать несколько месяцев или стран.

 %macro create_sales_month_country(data,month,country);
proc univariate data=amp;data;
  where month in (amp;month) and country in (amp;country) ;
  class month country;
  var sales;
run;
%mend ;
 

Итак, теперь вызов для примера включает кавычки. Вот так:

 %create_sales_month_country(data=my_data,month="January",country='United States')
 

И если вам нужны данные за два месяца для Соединенных Штатов, тогда используйте:

 %create_sales_month_country(data=my_data,month="June" "July",country='United States')
 

Комментарии:

1. Спасибо, Том, за подробное объяснение!