suponha que tenha o seguinte conjunto de dados:
data DB;
input ID :$20. Admission :date09. Discharge :date09. morbidity;
format Admission date9. Discharge date9.;
cards;
0001 13JAN2017 25JAN2017 1
0001 13JAN2017 25JAN2017 1
0001 22FEB2018 03MAR2018 0
0001 30JAN2019 04MAR2019 0
0002 01DEC2018 14DEC2018 0
0002 25DEC2018 02JAN2019 1
0002 25NOV2020 03DEC2020 0
0003 09JAN2016 25JAN2016 0
0003 29JAN2018 12FEB2018 0
...;
A morbidade = 1 indica que a morbidade ocorreu naquela data. Se as datas forem replicadas, elas terão 1 se a morbidade ocorreu e 0 se não. Existe uma maneira de obter o seguinte conjunto de dados?
data DB1;
input ID :$20. Admission :date09. Discharge :date09. morbidity new_morbidity;
format Admission date9. Discharge date9.;
cards;
0001 13JAN2017 25JAN2017 1 1
0001 13JAN2017 25JAN2017 1 1
0001 22FEB2018 03MAR2018 0 1
0001 30JAN2019 04MAR2019 0 1
0002 01DEC2018 14DEC2018 0 0
0002 25DEC2018 02JAN2019 1 1
0002 25NOV2020 03DEC2020 0 1
0003 09JAN2016 25JAN2016 0 0
0003 29JAN2018 12FEB2018 0 0
...;
Em outras palavras, para cada data, para cada ID (paciente), se a morbidade ocorreu antes da data real, a data real deve ter new_morbidity = 1 se tiver morbidade = 0. Caso contrário, é claro, terá new_morbidity= 1 se morbidade já for = 1. Isso linha por linha, data por data, através do histórico do paciente.
Alguém pode me ajudar, por favor? Não sei como gerenciar a comparação data real-data anterior.
Agradeço antecipadamente
Vamos supor que seus dados sejam ordenados por
ID, admission
. Quando um paciente morre,new_morbidity
deve ser 1 para todos os seus registros depois disso, a menos que sejam Jesus. Podemos aproveitar o processamento por grupo e aretain
declaração para lidar com isso.Faremos isso tendo
new_morbidity
retido automaticamente. Como seu valor não é inicializado em cada etapa, daremos a ele um valor somente sob certas circunstâncias. Esse valor será retido até decidirmos que ele precisa ser um novo valor.Se for o primeiro ID no grupo ou se
morbidity
for 1, definanew_morbidity
esse valor. Isso significa que semorbidity
for 0 ou 1 para o primeiro valor, 0 ou 1 sempre continuará para frente emnew_morbidity
. Semorbidity
mudar de 0 para 1, também continuaremos mantendonew_morbidity
1 para esse paciente.Para o caso extremo de Jesus, eu faria apenas
if(id = 'Jesus') then new_morbidity=0;