SAS:使用多行患者数据统计特定类型疾病的数量
我有数百万患者的大型数据集,包括诊断、时间戳、patientID和人口统计信息 我们发现,一种特殊类型的疾病经常与一种常见疾病并存 我想数一数每位患者患有的这类疾病的数量,然后创建一个直方图,显示有多少人患有1、2、3、4等其他疾病 这是数据的格式SAS:使用多行患者数据统计特定类型疾病的数量,sas,frequency,medical,Sas,Frequency,Medical,我有数百万患者的大型数据集,包括诊断、时间戳、patientID和人口统计信息 我们发现,一种特殊类型的疾病经常与一种常见疾病并存 我想数一数每位患者患有的这类疾病的数量,然后创建一个直方图,显示有多少人患有1、2、3、4等其他疾病 这是数据的格式 PatientID Diagnosis Date Gender Age 1 282.1 1/2/10 F 25 1 282.1 1/2/10 F
PatientID Diagnosis Date Gender Age
1 282.1 1/2/10 F 25
1 282.1 1/2/10 F 87
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 282.1 12/15/13 M 41
2 232.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 601.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
一般来说,我考虑的是DO循环,但我不确定从何处开始,因为数据集中存在重复项,就像patient 1一样,282.1列出了两次。我不知道该怎么解释。有什么想法吗
要统计的目标诊断数为282.1232.1250.02。在本例中,患者1的计数为3,患者2的计数为2,以此类推
编辑:
这是我使用的,但是输出在输出中的多行上显示每个PatientID
PROC SQL;
create table want as
select age, gender, patientID,
count(distinct diagnosis_description) as count
from dz_prev
where diagnosis in (282.1, 232.1)
group by patientID;
quit;
这就是输出表的外观。为什么这个病人会出现这么多次
Obs AGE GENDER PATIENTID count
1 55 Male 107828695 1
2 54 Male 107828695 1
3 54 Male 107828695 1
4 54 Male 107828695 1
5 54 Male 107828695 1
我想你可以通过SQL语句得到你想要的
PROC SQL NOPRINT;
create table want as
select PatientID,
count(distinct Diagnosis) as count
from have
where Diagnosis in (282.1, 232.1, 250.02)
group by PatientID;
quit;
这将只过滤到您感兴趣的诊断,统计PatientID看到它们的不同时间,并将结果保存到新表中。我认为您可以通过SQL语句获得所需的结果
PROC SQL NOPRINT;
create table want as
select PatientID,
count(distinct Diagnosis) as count
from have
where Diagnosis in (282.1, 232.1, 250.02)
group by PatientID;
quit;
这将只过滤到您感兴趣的诊断,统计PatientID看到它们的不同时间,并将结果保存到新表中。如果您包含的变量既不是分组变量也不是汇总统计信息,SAS将很高兴地将汇总统计信息与所有源记录重新合并。这就是为什么您会得到多个记录。如果数据集覆盖多年,则年龄通常会有所不同。如果你的数据杂乱无章,性别也会有所不同。因此,为了快速分析,您可以尝试这样的方法
create table want as
select patientID
, min(age) as age_at_onset
, min(gender) as gender
, count(distinct diagnosis_description) as count
from dz_prev
where diagnosis in (282.1, 232.1)
group by patientID
;
如果您包含的变量既不是分组变量,也不是摘要统计信息,那么SAS将很高兴地将摘要统计信息与所有源记录重新合并。这就是为什么您会得到多个记录。如果数据集覆盖多年,则年龄通常会有所不同。如果你的数据杂乱无章,性别也会有所不同。因此,为了快速分析,您可以尝试这样的方法
create table want as
select patientID
, min(age) as age_at_onset
, min(gender) as gender
, count(distinct diagnosis_description) as count
from dz_prev
where diagnosis in (282.1, 232.1)
group by patientID
;
发布您尝试过的内容。您的下一个问题是哪些疾病和群体是什么,因此请确保您的方法现在考虑到了这一点。@Reeza我已更新帖子,以显示我尝试过的内容和结果。您包含的变量年龄和性别既不是群体变量,也不是聚合统计数据。将他们添加到组中,或者从所选变量列表中删除他们。张贴您尝试过的内容。您的下一个问题是哪些疾病和组是什么,因此请确保您的方法现在考虑到了这一点。@Reeza我已更新帖子,以显示我尝试过的内容和结果。您包括了年龄和性别这两个变量既不是组变量,也不是聚合统计。将它们添加到组中或从所选变量列表中删除。非常感谢您的建议!我试过了,把它放在输出中给我多行相同的patientID。我已经更新了上面的帖子。有什么想法吗?@Kevin,如果你按图所示编码,上面的解决方案就可以了。如果在代码中使用年龄/性别,则不会。请注意,你的问题中没有一个关于年龄/性别的词,因此根据你的提问,这个答案是正确的。这就是为什么展示你在做什么很重要的原因。根据你最新的问题,Tom所做的将会起作用。另一个选项是对显示的内容进行编码,并在单独的连接中添加年龄和性别信息。非常感谢您的建议!我试过了,把它放在输出中给我多行相同的patientID。我已经更新了上面的帖子。有什么想法吗?@Kevin,如果你按图所示编码,上面的解决方案就可以了。如果在代码中使用年龄/性别,则不会。请注意,你的问题中没有一个关于年龄/性别的词,因此根据你的提问,这个答案是正确的。这就是为什么展示你在做什么很重要的原因。根据你最新的问题,Tom所做的将会起作用。另一个选项是对显示的内容进行编码,并在单独的连接中添加年龄和性别信息。非常感谢!我将如何显示哪些人有我们正在寻找的0个诊断?您需要改变方法,因为您不能使用WHERE来消除观察结果。而是使用CASE语句将其移动到COUNT函数中。countdistinct case当在282.1232.1中进行诊断时,则诊断描述结束您将在将诊断代码存储在数字变量中时遇到问题。ICD10代码都以字母开头,ICD9中也有以字母开头的V和E代码。我完全同意将诊断代码存储为数字变量
可悲的。我没有在示例数据片段中包含ICD10代码,但它们确实存在。您建议的替代方案是什么?它实际上并不影响此查询的逻辑,而是将代码存储为字符串。因此,您对特定值的查询需要使用字符串文字而不是数字文字。非常感谢!我将如何显示哪些人有我们正在寻找的0个诊断?您需要改变方法,因为您不能使用WHERE来消除观察结果。而是使用CASE语句将其移动到COUNT函数中。countdistinct case当在282.1232.1中进行诊断时,则诊断描述结束您将在将诊断代码存储在数字变量中时遇到问题。ICD10代码都以字母开头,ICD9中也有以字母开头的V和E代码。我完全同意将诊断代码存储为数字变量。我没有在示例数据片段中包含ICD10代码,但它们确实存在。您建议的替代方案是什么?它实际上并不影响此查询的逻辑,而是将代码存储为字符串。因此,对特定值的查询需要使用字符串文本而不是数字文本。