Select 基于就诊次数的疾病发病日期
Select the onset date of a disease based on the number of visits
我有关于感染就诊的数据。个人可以有 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 的第一个日期是 selected,因为一年内有 2+ 次访问。跳过第一次访问后和第一次访问后一年内的所有访问(第 2 行和第 3 行)。第二个日期是第4行,距第一次就诊一年多,一年内又来一次。
对于 ID=2,我们 select 仅第一次约会并跳过一年内的所有下一次访问。
对于 ID=3,我们不 select 任何日期,因为一年内访问不超过一次。
尝试以下方法,在处理实际的完整数据时可能需要稍微调整一下。
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;
我有关于感染就诊的数据。个人可以有 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 的第一个日期是 selected,因为一年内有 2+ 次访问。跳过第一次访问后和第一次访问后一年内的所有访问(第 2 行和第 3 行)。第二个日期是第4行,距第一次就诊一年多,一年内又来一次。
对于 ID=2,我们 select 仅第一次约会并跳过一年内的所有下一次访问。
对于 ID=3,我们不 select 任何日期,因为一年内访问不超过一次。
尝试以下方法,在处理实际的完整数据时可能需要稍微调整一下。
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;