我有数百万患者遭遇的大型数据集,其中包括诊断、时间戳、patientID和人口统计信息。
对于每个病人,他们的诊断被列在多个线上。我需要排除有特定诊断的病人(282.1),并计算2014年其他疾病的发病率。
IF diagnosis NE 282.1; 这在数据步骤中不起作用,因为它没有考虑到其他行上的其他诊断。
如果可能的话,我也想按疾病计算发病率。
这是数据外观的一个例子。有多条有多种诊断的线路。
PatientID Diagnosis Date Gender Age
1 282.1 1/2/10 F 25
1 232.1 1/2/10 F 87
1 250.02 1/2/10 F 41
1 125.1 1/2/10 F 46
1 90.1 1/2/10 F 58
2 140 12/15/13 M 57
2 132.3 12/15/13 M 41
2 149.1 12/15/13 M 66
3 601.1 11/19/13 F 58
3 231.1 11/19/13 F 76
3 123.1 11/19/13 F 29
4 282.1 12/30/14 F 81
4 130.1 12/30/14 F 86
5 230.1 1/22/14 M 60
5 282.1 1/22/14 M 46
5 250.02 1/22/14 M 53发布于 2017-08-09 21:32:04
双读解
直进版
你说你先对数据进行排序,可能是这样
proc sort data=MYLIB.DIAGNOSES;
by PatientID;
run;假设您的数据是由patientID排序的,您可以先处理每一个带有诊断的数据以排除数据。
data WORK.NOT_HAVING_282_1;
set MYLIB.DIAGNOSES (where=(diagnosis EQ 282.1))
MYLIB.DIAGNOSES (where=(diagnosis NE 282.1));
by PatientID;我们需要按年份,而不是按日期报告:
year = year(Date);下一步是排除不需要的诊断,因此需要记住是否发生了不必要的诊断:
retain has_282_1;
if first.PatientID then has_282_1 = 0;
if diagnosis EQ 282.1 then has_282_1 = 1; 然后在2014年保留对没有282.1的病人的其他诊断
else if not has_282_1 then output;
run;接下来,您可以使用SQL来计算所需的内容。
proc sql:
create table MYLIB.STATISTICS as
select year, Diagonsis, count(distinct PatientID) as incidence
from WORK.NOT_HAVING_282_1
group by year, Diagonsis;
quit;改进
上述解决方案需要更多的处理能力,因此需要:
DIAGNOSES,然后将FIRST_282_1写到磁盘上,然后再读取它。count(distinct PatientID),这是一项昂贵的手术。关于诊断282.1,我们只需要知道谁曾被诊断过:
proc sort noduplicates
data=MYLIB.DIAGNOSES (where=(diagnosis EQ 282.1))
out=WORK.HAVING_282_1 (keep=PatientID);
by PatientID;
run;关于其他诊断,我们也需要这一年,在这里:
data WORK.VIEW_OTHER / view=WORK.VIEW_OTHER;
set MYLIB.DIAGNOSES (where=(diagnosis NE 282.1));
year = year(Date);
keep PatientID year Diagnose;
run;但是,在使用视图之前,我们不实际读取和计算任何内容:
proc sort noduplicates
data=WORK.VIEW_OTHER (where=(diagnosis EQ 282.1))
out=WORK.OTHER_DIAGNOSES;
by PatientID year Diagnose;
run;现在事情变得更简单了。我们使用临时变量exclude和other来指示数据的来源。
data WORK.NOT_HAVING_282_1;
set WORK.HAVING_282_1 (in=exclude)
WORK.OTHER_DIAGNOSES (in=other);
by PatientID;
retain has_282_1;
if first.PatientID then has_282_1 = exclude;
if other and not has_282_1 then output;
run;
proc sql:
create table MYLIB.STATISTICS as
select year, Diagonsis, count(*) as incidence
from WORK.NOT_HAVING_282_1
group by year, Diagonsis;
quit;备注:此代码未进行测试。
https://stackoverflow.com/questions/45580795
复制相似问题