sql - 根据访问次数选择疾病的发病日期
问题描述
我有关于感染就诊的数据。个人可以进行 1 次以上的访问。如果一个人在一年内进行了一次以上的就诊,临床医生会认为他已被感染。然后,第一次访问的日期被认为是感染开始。
例如, ids 1
、2
和3
有以下访问:
Data have;
INPUT row ID date;
CARDS;
1 1 2017-03-22
2 1 2017-04-26
3 1 2018-02-20
4 1 2018-04-07
5 1 2018-04-16
6 2 2014-01-15
7 2 2014-06-23
8 2 2014-07-23
9 2 2015-01-14
10 3 2018-01-22
11 3 2019-05-03
;
run;
根据感染的临床定义,我想要这些日期:
排 | ID | 日期 |
---|---|---|
1 | 1 | 2017-03-22 |
4 | 1 | 2018-04-07 |
6 | 2 | 2014-01-15 |
选择 ID=1 的第一个日期是因为一年内有 2 次以上的访问。跳过第一次访问后和第一次访问后一年内的所有访问(第 2 行和第 3 行)。第二个日期是第 4 行,距离第一次访问超过一年,之后一年内还有一次访问。
对于 ID=2,我们只选择第一个日期并跳过一年内的所有下一次访问。
对于 ID=3,我们不选择任何日期,因为一年内访问次数不超过一次。
解决方案
尝试以下方法,在处理实际完整数据时可能需要进行一些调整。
Data have;
INPUT row:4. ID:4. date yymmdd10.;
year=year(date);
format date yymmdd10.;
CARDS;
1 1 2017-03-22
2 1 2017-04-26
3 1 2018-02-20
4 1 2018-04-07
5 1 2018-04-16
6 2 2014-01-15
7 2 2014-06-23
8 2 2014-07-23
9 2 2015-01-14
10 3 2018-01-22
11 3 2019-05-03
;
run;
/*keep the first date per id*/
data first_visit;
set have;
by id;
if first.id;
run;
/*find the year difference for each subsequent date with first date*/
proc sql;
create table visits1
as
select a.*,
int(abs(yrdif(b.date,a.date,'ACT/365'))) as date_diff_first
from have a
inner join first_visit b
on a.id=b.id;
quit;
/*part1 - find the first symptom onset date where we have multiple visits per year*/
proc sql;
create table part1_0
as
select distinct a.*
from visits1 a
inner join visits1 b
on a.id=b.id
and a.date<b.date
and a.row+1=b.row
and a.year=b.year
and a.date_diff_first=0 and b.date_diff_first=0;
quit;
data part1;
set part1_0;
by id;
if first.id;
run;
/*part2 - Now find other symptom onset date for same id in another year 1 year apart*/
proc sql;
create table part2_0
as
select distinct a.row, a.id, a.date
from visits1 a
inner join part1 b
on a.id=b.id
inner join visits1 c
on a.id=c.id
and a.date>b.date
and a.year<>b.year
and a.date_diff_first=1 and b.date_diff_first=0
and a.row+1=c.row;
quit;
data part2;
set part2_0;
by id;
if first.id;
run;
/*combine both*/
data final;
set part1 part2;
keep row id date;
run;
proc sort data=final; by row id date; run;
推荐阅读
- c++ - 在 C++ 中读取 CSV 文件中的特定行
- arrays - Ruby - 将数组元素移动到给定位置
- ms-access - 更新事件后未触发更新查询 (MS Access)
- javascript - TypeScript:难以键入可以在对象内部的特定级别进行过滤同时保留其原始结构的函数
- express - 使用 azure 应用服务的快速会话未通过 https 保存/保留
- python - 当我的缩进正确时,为什么 python 给我一个错误的缩进?(已回答)
- python - 在Python中获取纬度和经度的集群中心点
- java - org.xml.sax.SAXParseException;系统标识
- c# - 如何在 ML.net 中使用 GloVe 词嵌入模型
- android - 在运行时从片段启用全屏无法与具有缺口的设备一起使用