2016-06-28 2 views
0

У меня есть огромный набор данных, содержащий людей, в которых некоторые из них имеют несколько процедур кода ICD-9. Мне нужно создать несколько когорт, в зависимости от того, какие ICD-9 кодируют эти люди, но моя обработка не работает, как я ее намереваюсь.Обработка по группам SAS: присвоение значений для всей группы

Вот набор выборки данных:

DATA TEST; 
    INPUT ID: $5. CODE; 
    FORMAT CODE Z4.; 
    DATALINES; 
    A 8006 
    A 8155 
    A 0080 
    A 0081 
    A 0082 
    A 0083 
    A 0084 
    B 8006 
    B 8155 
    B 0080 
    B 0081 
    B 0082 
    B 0083 
    B 0084 
    B 9999 
    ; 
RUN; 

Субъекты А и В имеют те же самые коды, за исключением того, Тема В имеет дополнительный фиктивный код 9999. Здесь, если у субъекта ТОЛЬКО есть коды 8006, 8155 и 0080 до 0084 (и ничего больше!), Тогда они помещаются в одну когорту. Тема A должна быть одной когорты, субъект B должен быть другим из-за фиктивного кода.

ниже код не делает по-обработки, как я намерен:

DATA TEST1; SET TEST; 
    BY ID; 
    IF CODE IN (8006,8155,0080:0084) THEN COHORT=1; 
     ELSE COHORT=2; 
RUN; 

ID CODE COHORT 
A 8006 1 
A 8155 1 
A 0080 1 
A 0081 1 
A 0082 1 
A 0083 1 
A 0084 1 
B 8006 1 
B 8155 1 
B 0080 1 
B 0081 1 
B 0082 1 
B 0083 1 
B 0084 1 
B 9999 2 

Я хочу, чтобы это выглядело так:

ID CODE COHORT 
A 8006 1 
A 8155 1 
A 0080 1 
A 0081 1 
A 0082 1 
A 0083 1 
A 0084 1 
B 8006 2 
B 8155 2 
B 0080 2 
B 0081 2 
B 0082 2 
B 0083 2 
B 0084 2 
B 9999 2 

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

ответ

2

Поскольку у того же человека могут быть коды, которые помещают их в несколько групп, вам необходимо определить каждую группу независимо. Создайте отдельную переменную для каждой когорты. Вы можете использовать функцию агрегации MAX() в PROC SQL. Но вот как бы я это сделал, используя технику DOW на шаге DATA.

data want ; 
    do until (last.id) ; 
    set have ; 
    by id; 
    if code = '8154' then COHORT1=1; 
    else if code in ('8006','8155') or '0080' <= code <= '0084' then COHORT2=1; 
    else if code = '8151' then COHORT3=1; 
    else if code = '8153' or '0070' <= code <='0073' then COHORT4=1; 
    else if code = '8156' then COHORT5=1 ; 
    end; 
    if N(of COHORT1-COHORT5) > 1 then COHORT=6; 
    else COHORT=whichn(1,of COHORT1-COHORT5); 
    drop cohort1-cohort5 ; 
run; 
+0

Спасибо @Tom. Оператор 'WHICHN' присваивает значения' COHORT = 0'? Я просто хочу быть в курсе документации. – Foxer

+0

Да, функция WHICHN() вернет 0, если значение не найдено. – Tom

0

Вы можете сделать это довольно легко на этапе proc sql. Операторы case when определяют когорту для каждой строки, как это было на вашем шаге данных, а max в сочетании с group by находит максимальное значение операторов case when для каждого идентификатора. Поэтому, если все строки для данного идентификатора имеют значение cohort_pre, значение 1, вы получите максимум 1; иначе вы получите более высокую когорту.

proc sql; 
    create table test1 as select distinct 
     id, code, 
     case when code = 8154 then 1 
      when code in(8006,8155,0080:0084) then 2 
      when code = 8151 then 3 
      when code in(8153,0070:0073) then 4 
      when code = 8156 then 5 else 99 end as cohort_pre, 
      case when count(distinct calculated cohort_pre) = 1 then max(calculated cohort_pre) 
      else 6 end as cohort 
     from test 
     group by id; 
quit; 
+0

Интересно, спасибо за понимание @superfluous. Это отлично работает на моем примере, но похоже, что он может запутаться учитывая мои фактические условия когорты: 'КОГОРТА 1 = 8154 КОГОРТА 2 = 8006,8155,0080: 0084 КОГОРТА 3 = 8151 КОГОРТА 4 = 8153, 0070: 0073 COHORT 5 = 8156 COHORT 6 = любая комбинация 1-5' Ha Я вижу, что он делает, но я не слишком хорошо знаком со сложными операторами SQL, чтобы я мог видеть, где это получится довольно волосатое. Мои тестовые данные, вероятно, не помогли моей причине, как я ее описал. – Foxer

+0

Можете ли вы точно объяснить, как вы хотите, чтобы cohort6 работал? Я обновил код, чтобы показать, как будут влиять другие. – superfluous

+0

У кого-то, классифицированного как Cohort 6, было бы, например, 8154 и 0073, которое является комбинацией Cohort 1 и Cohort 4. Я думаю, что я мог бы просто добавить еще один «случай, когда» line перечислите все значения выше аналогичным образом. Это здорово, хотя, спасибо за добавление этих дополнительных строк. – Foxer

Смежные вопросы