SAS: используя в первую очередь. прошлой. в%, если в% макрос - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь построить ячейки для числовых переменных.Все работало нормально, когда я не использовал% 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);

Результат такой: enter image description here

, поэтому цикл не распознает аргумент в%, если часть.

Спасибо за помощь !!

[Редактировать]:

Чтобы уточнить, я хочу сделать следующие шаги:

  1. для переменной в списке и var_list.

  2. построить для него ранг

  3. отсортировать по этой переменной

  4. , используя данные шаг за шагом:группировать по рангу

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

  6. некоторые последующие шаги ...

Так что, в основном, я хочу создать интервал для начала и конца ранга.

Я пример с картинки;первый ряд имеет первый.= 1, поэтому Start_bin должен быть $ 10.280, а End_bin должен быть пустым.Следующий ряд должен быть пустым, потому что оба первые.и последнее.0.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Если вы в конечном итоге ищете границы бина, с группами = 10, разве это не было бы эквивалентно нахождению процентилей через сводку proc или средства proc? Преимущество использования метода процентилей также означает, что вы можете обрабатывать несколько переменных одновременно. Я не установил здесь никаких связей, но я также уверен, что это можно сделать.

ods select none; /*do not display output - faster processing*/
proc means data=sashelp.cars /*input data set*/
    stackods  /*stack ods to have the table appear with statistics across the top*/
    N NMISS Min P10 P20 P30 P40 P50 P60 P70 P80 P90 Max /*stats to show*/;
var mpg_city mpg_highway invoice msrp; /*variables included in analysis*/
ods output summary = want; /*capture output into a data set*/
run;
ods select all; /*reset output options*/
0 голосов
/ 12 ноября 2018

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

%if first.&rank_column. = 1 %then %do;

Никогда не будет истиной, даже если rank_column пусто, потому что строка first. никогда не сможетравна строке 1.

Но если вы закодируете ее, используя код SAS вместо макрокода

if first.&rank_column. = 1 then do;

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

Вероятно, у вас большие проблемы с общей логикой, поскольку вы перезаписываете одинаковые имена переменных start_bin и end_bin в одном наборе данных.Таким образом, после завершения макроса будут доступны только значения для ячеек, сгенерированных последней переменной в вашем списке.

...