Таблицы генерации SAS на основе условного?

Я пытаюсь написать макрос, который создаст новую таблицу в зависимости от определенных критериев. Пользователь может ввести одно число или диапазон чисел, чтобы отфильтровать исходные данные.

Например, если начальный набор данных показан ниже, конечный пользователь может выбрать фильтрацию столбца Z по одному числу (т. е. где Z=1) или по диапазону чисел (т. е. где Z находится в диапазоне от 1 до 5).

X    Y    Z
0    1    3
2    7    9
0     0   0
2     1   1

Если пользователь хочет ввести диапазон чисел для фильтрации, будут заполнены значения для &start_range и &end_range. Если пользователь хочет отфильтровать одно число, &end_range будет равен нулю.

Мне нужен код, который будет проверять, равен ли &end_range нулю. Если это так, оператор where должен создать новую таблицу для всех строк, где столбец Z=&start_range. Если &end_range НЕ равен нулю (у него есть заполненное значение), оператор where создаст новую таблицу для всех строк, где столбец Z находится между &start_range и &end_range.

Для одного значения (где &start_range=1 и &end_range='') результирующая таблица будет следующей:

X    Y    Z
2     1   1

Для диапазона значений (где &start_range=1 и &end_range=5) результирующая таблица будет выглядеть так:

X    Y    Z
0    1    3
2     1   1

Это код, который у меня есть до сих пор, не уверен на 100%, правильный ли синтаксис, поэтому открыт для любых предложений, спасибо !!:

 %macro filter();

proc sql;   
            create table filtered_data AS
            select raw_data.* 
            from raw_data
            WHERE       

                  %if &end_range NE '' %then %do;
                        Z between '&start_range' AND '&end_range';
                  %end;

                  %else %do;
                        Z = '&start_range';
                  %end;

            quit;

%mend;

%filter();

person Brad    schedule 04.05.2015    source источник
comment
Вопросы о конкретной проблеме, как правило, лучше подходят для формата вопросов и ответов на этом сайте, чем общие запросы по устранению неполадок. Тем не менее, у меня есть два предложения. (1) Параметры макроса, вероятно, должны быть перечислены в операторе %macro и указаны при вызове макроса. (2) Вам не нужно повторять весь запрос; вы можете поместить условия %if %then %else в оператор where, чтобы управлять только теми строками кода, которые могут измениться. Это не сильно влияет, но дает понять тому, кто читает код, какая именно часть кода является условной.   -  person DWal    schedule 04.05.2015
comment
Если вызовы макросов (и параметры) будут написаны вручную, то вы можете просто передать предложение where, которое хотите использовать в макросе. Это упражнение действительно полезно только в том случае, если вы собираетесь генерировать динамические вызовы макроса и не знаете, какими будут значения ваших параметров.   -  person Robert Penridge    schedule 04.05.2015


Ответы (1)


Вместо создания определения макроса я бы предложил решить вашу проблему, создав 2 простые макропеременные для вашего начального и конечного диапазона. Начальный диапазон всегда будет иметь допустимое число, но для конечного диапазона вы можете запрограммировать логику, чтобы принять значение начального диапазона, если значение конечного диапазона пустое/нулевое. Проверьте приведенный ниже код и дайте мне знать, если это поможет.

data raw_data;
infile datalines missover;
input X    Y    Z;
datalines4;
0    1    3
2    7    9
0     0   0
2     1   1
;;;;
run;
/*User enters the range*/
%let start_range=1;
%let end_range=5;

/*User entered data refining*/
%let end_range=%sysfunc(coalescec(&end_range,&start_range));

proc sql;
create table filtered_data AS
select *
from raw_data
where z between &start_range and &end_range
;
quit;
proc print data=filtered_data;run;

Если вы по-прежнему предпочитаете создавать определение макроса для решения вашей проблемы, попробуйте настроить свой первый оператор %IF в своем определении макроса и удалите одинарные кавычки, которые вы применили к своим переменным макроса в операторе WHERE в PROC SQL. Ознакомьтесь с обновленным определением макроса.

%macro filter;
proc sql;   
            create table filtered_data AS
            select raw_data.* 
            from raw_data
            WHERE       
                  %if %length(&end_range) %then %do;
                        Z between &start_range AND &end_range;
                  %end;

                  %else %do;
                        Z = &start_range;
                  %end;
            quit;
%mend;
%filter;
person sushil    schedule 04.05.2015