Я пытаюсь построить ячейки для числовых переменных.Все работало нормально, когда я не использовал% macro, поэтому я считаю, что это что-то специфическое для макросов.В основном эта часть кода:
%if first.&rank_column. = 1 %then %do;
не работает, как я ожидал.Ниже я упростил до одной итерации и одной переменной, но в моем реальном коде их гораздо больше - однако проблема та же.
Полный код:
/* Build binns */
%let var_list = MSRP Invoice;
%macro group_var_in_bins(source_table);
data WITH_BINNS;
set &source_table.;
run;
%let loop_count = %sysfunc(countw(&var_list));
%do i=1 %to &loop_count.;
* list of variables to use;
%let variable = %scan(&var_list, &i);
%let rank_column = &variable._bins_rank;
proc rank data=WITH_BINNS out=WITH_BINNS groups=10 ties=low;
var &variable.;
ranks &rank_column.;
run;
* sort the table by this variable;
proc sort data=WITH_BINNS out=WITH_BINNS;
by &variable.;
run;
* Build start and end observation of particular bin;
data WITH_BINNS;
set WITH_BINNS;
by &rank_column.;
*this is just to check if first.&rank_column works;
first_&rank_column. = first.&rank_column.;
last_&rank_column. = last.&rank_column.;
%if first.&rank_column. = 1 %then %do;
/* here %if first.&rank_column. %then %do erros so something is wrong with argument statement*/
Start_bin = &variable.;
%end;
%else %do;
Start_bin = .;
%end;
%if last.&rank_column. = 1 %then %do;
End_bin = &variable.;
%end;
%else %do;
End_bin = .;
%end;
run;
%end;
* some more code which amends WITH_BINNS table;
%mend group_var_in_bins;
%group_var_in_bins(sashelp.cars);
Результат такой:
, поэтому цикл не распознает аргумент в%, если часть.
Спасибо за помощь !!
[Редактировать]:
Чтобы уточнить, я хочу сделать следующие шаги:
для переменной в списке и var_list.
построить для него ранг
отсортировать по этой переменной
, используя данные шаг за шагом:группировать по рангу
найти значение этой переменной, которое соответствует началу группы, используя first.и конец конца группы, используя последний.оставьте все пустым
некоторые последующие шаги ...
Так что, в основном, я хочу создать интервал для начала и конца ранга.
Я пример с картинки;первый ряд имеет первый.= 1, поэтому Start_bin должен быть $ 10.280, а End_bin должен быть пустым.Следующий ряд должен быть пустым, потому что оба первые.и последнее.0.