4.3 SELECT Groups

В качестве альтернативы IF-THEN можно также использовать выражение SELECT-WHEN .

SELECT <(select-expression)>;
    WHEN-1 (when-expression-1 <..., when-expression-n>) statement 1;
    WHEN-n (when-expression-1 <..., when-expression-n>) statement 2;
    OTHERWISE <statement>;
END;

SELECT-WHEN выполняет одно или несколько действий, основываясь на переменную, которую вы задаете в select-expression. B WHEN-1 - WHEN-n указываются возможные значения переменной. SAS сравнивает значение на каждом наблюдении с заданным в WHEN-1 и если TRUE (верно), выполняет statement 1. В ином случае, переходит к следующему WHEN-2 и т.д. Если же все WHEN-1 - WHEN- n оказались FALSE (не верными), тогда переходим к OTHERWISE и выполняется statement.

Рассмотрим пример на нашем дата сете Medications:

4.3.1

Создадим численную переменную TRTN для каждой лечащей группы (Treatment group):

data trt_num;
    set medications;
    select(TRT);
        when("QCM") TRTN=1;
        when("QKP") TRTN=2;
        when("QVA") TRTN=3;
        otherwise TRTN=4;
    end;
run;

Для этого в качестве select-expression выбираем переменную TRT, и для каждого ее значения в when определяем, чему равно численное ее значение. Так как мы знаем, что всего у нас 4 treatment groups и НЕТ пустых значений TRT, то под otherwise подразумеваем лечение «RWC» .

Полученный дата сет trt_num:

Lesson4.3.2

Также в выражении SELECT-WHEN можно не указывать select-expression и пользоваться логическими операторами и операторами сравнения.

В качестве примера, определим для каждого пациента запланированную дату начала и конца лечения, в зависимости от treatment group:

data trt_date;
    set Medications;
    length start_date end_date $10;
    
    select;
        when(TRT in ('QVA', 'QCM')) 
            do;
                start_date="2013-07-25";
                end_date="2014-08-03";
            end;
        when (TRT='QKP')
            do;
                start_date="2013-06-17";
                end_date="2014-12-17";
            end;
    when (TRT="RWC") start_date="2014-02-27";
    
    otherwise;
	end;
run;

Для того, чтобы не делать одно и то же действие для 2 treatment group QVA и QCM , можно применить оператор in. Также когда при одном и том же условии нам нужно определить одновременно и дату начала, и дату конца. В этом случае удобно воспользоваться do-end блоком. Так как для группы RWC мы не указали дату конце, эта переменная остается пустой.

Полученный дата сет trt_date:

Lesson4.3.2

Стоить заметить, что в утверждении otherwise ничего не указано. В этому случае, если бы мы имели наблюдение с пустым TRT, дата конца и дата начала были бы также пустыми.

Дополнительные материалы: