首页 > 解决方案 > 根据访问次数选择疾病的发病日期

问题描述

我有关于感染就诊的数据。个人可以进行 1 次以上的访问。如果一个人在一年内进行了一次以上的就诊,临床医生会认为他已被感染。然后,第一次访问的日期被认为是感染开始。

例如, ids 123有以下访问:

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,我们不选择任何日期,因为一年内访问次数不超过一次。

标签: sqlsasproc-sql

解决方案


尝试以下方法,在处理实际完整数据时可能需要进行一些调整。

  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;
        

推荐阅读