Определить дату интенсификации лечения - PullRequest
0 голосов
/ 12 марта 2020

У меня есть данные, которые выглядят как -

data abc;
input ID $ drug $ episode start_date date9. end_date date9.;
format start_date end_date date9.;
informat start_date end_date date9.;
datalines ;
1 A 1 01Jan2012 30Mar2012
1 A 2 01May2012 03Jul2012
1 A 3 28Sep2012 28Oct2012
1 A 4 01Nov2012 30Dec2012
1 B 1 01Apr2012 10May2012
1 B 2 02Nov2012 28Dec2012
1 B 3 01Jan2012 30Mar2012
1 C 1 01Jul2012 02Aug2012
;
run;

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

Если дата начала (дата начала 1-го эпизода) употребления второго препарата лежит между эпизодами первого препарата, тогда мы будем игнорировать все дальнейшие эпизоды 1-го препарата.

Например , здесь 1 апреля (дата начала приема препарата B) лежит после первого эпизода приема препарата A, поэтому эпизод 2,3,4 препарата A. будет удален.

Аналогично, дата начала приема препарата C будет после дата окончания эпизода 1 для препарата B, а затем эпизода 2 для препарата B будет удалена.

Максимальное количество эпизодов, которое может иметь субъект, составляет 15.

Результирующий набор данных должен выглядеть следующим образом -

ID  Drug    Episode start_date  end_date
1   A   1   1-Jan   30-Mar
1   B   1   1-Apr   10-May
1   C   1   1-Jul   2-Aug

1 Ответ

0 голосов
/ 12 марта 2020

Как насчет этого? Я добавил еще один идентификатор в пример данных для демонстрации.

data abc;
input ID $ drug $ episode start_date :date9. end_date :date9.;
format start_date end_date date9.;
datalines ;
1 A 1 01Jan2012 30Mar2012
1 A 2 01May2012 03Jul2012
1 A 3 28Sep2012 28Oct2012
1 A 4 01Nov2012 30Dec2012
1 B 1 01Apr2012 10May2012
1 B 2 02Nov2012 28Dec2012
1 B 3 01Jan2012 30Mar2012
1 C 1 01Jul2012 02Aug2012
2 A 1 01Jan2012 30Mar2012
2 A 2 01May2012 03Jul2012
2 A 3 28Sep2012 28Oct2012
2 A 4 01Nov2012 30Dec2012
2 B 1 01Apr2012 10May2012
2 B 2 02Nov2012 28Dec2012
2 B 3 01Jan2012 30Mar2012
2 C 1 01Jul2012 02Aug2012
;
run;

data want;

    format ID drug episode start_date end_date;
    keep   ID drug episode start_date end_date;

    declare hash h ();
    h.definekey  ('ID', 'd');
    h.definedata ('_start_date');
    h.definedone ();

    do until (lr1);
        set abc (rename= (start_date = _start_date)) end=lr1;
        by ID drug;
        if first.ID   then d = 0;
        if first.drug then d + 1;
        if episode = 1 then h.add();
    end;

    do until (lr2);
        set abc end=lr2;
        by ID drug;
        if first.ID   then d = 0;
        if first.drug then do;
            d + 1; flag = 0;
        end;
        rc = h.find(key : ID, key : d+1);
        if start_date > _start_date then flag=1;
        if flag = 0 then output;
    end;

    retain flag;
run;

Результат:

ID  drug  episode  start_date  end_date 
1   A     1        01JAN2012   30MAR2012 
1   B     1        01APR2012   10MAY2012 
1   C     1        01JUL2012   02AUG2012 
2   A     1        01JAN2012   30MAR2012 
2   B     1        01APR2012   10MAY2012 
2   C     1        01JUL2012   02AUG2012 
...