【问题标题】:Left join PROC SQL using threshold date使用阈值日期左连接 PROC SQL
【发布时间】:2020-04-29 03:37:42
【问题描述】:

我希望你能帮助我! 请帮忙!!!!

我在使用 PROC SQL 的 SAS 中,我有数据集 A 和 B 具有不同的测量值(与患者的健康有关),如下所示:

数据集 A

ID       Date              measurement_a
1      20JUN2013               52.3
1      12JUL2013               65.6
1      28NOV2014               37.4
1      02DEC2014               61.3
1      22SEP2015               40.5
1      15OCT2015               60.5
2      03JUN2011               46.5 
2      19JUL2011               54.1
2      29OCT2012               53.6
...

数据集 B

ID       Date              measurement_b
1      21MAR2007               43
1      13JUL2007               45
1      07APR2009               47
1      14MAY2009               46
1      16FEB2012               42
1      27AUG2012               53
1      12DEC2012               58 
1      20JUN2013               56
1      10DEC2013               53
1      23MAY2014               49
1      17SEP2014               44
1      23SEP2015               40
2      16DEC2011               58
2      22AUG2012               54
2      20FEB2013               56
2      29MAY2013               53
...

我正在寻找的是,如果数据集 B 中的日期在数据集 a 中的日期的 6 个月内,那么将添加一个名为“时间”的新变量,例如 1、2、3 等。有多少与 ** only measure_a** 长度匹配(换句话说,如果 measure_b 的值与数据集 a 中的日期不匹配,我不需要保留它。这是我的意思的一个示例:

所需结果/数据集:

ID     Time      measurement_a       measurement_b 
1        1             52.3               56 (Dataset B Date = 20JUN2013 - Matched exactly)
1        2             65.6               53 (Dataset B date = 10DEC2013 - Within six months of 12JUL2013 [Dataset A Date])
1        3             37.4               44 (Dataset B date = 17SEP2014 - Within six months of 28NOV2014 [Dataset A Date])
1        4             61.3                . (because 17SEP2014 [Dataset B] is closest to 28NOV2014 [Dataset A])       
1        5             40.5               40 (because 23SEP2015 [Dataset B] is closest to 22SEP2015 [Dataset A])
1        6             60.5                . (No date in Dataset B that is within 6 months of Date in Dataset A [15OCT2015])

2        1             46.5                . (See below)
2        2             54.1               58 (because 03JUL2011 [Dataset B] is closest to 19JUL2011 [Dataset A]) 
2        3             53.6               54 (Dataset B date = 22AUG2012 - Within 6 months of Dataset A date = 29OCT2012)
...

我已经加入了 ID,但时间证明很困难。我知道这可能是以下代码中“where”语句中的月份差异:

PROC SQL;
CREATE TABLE join_test as
SELECT * FROM data_a as a
LEFT_JOIN data_b as b
ON a.id = b.id 
WHERE days(a.Date - b.Date) <= 180 ;
QUIT;

但这并不能解决问题。

可以帮助我吗?

我真的很感激。提前致谢。

【问题讨论】:

  • 每“数据集 B 中的日期在数据集 a 中的日期的 6 个月内”,您的意思是说 B 中的日期在 A 中的日期之后最多 6 个月? B日期是否可以在以A日期为中心的12个月内(即从前6个月到后6个月)

标签: sas left-join proc-sql


【解决方案1】:

在连接条件中添加使用 SAS 函数 INTCK 来计算两个日期值之间的月间隔数。 Proc SQL 无法引入序列计数值,因此您必须在后续步骤中添加它。 LEFT JOIN 将创建一个结果集,其中包含表 A 中的每个 id/date。

示例: 添加了 a.dateb_datec_months_apart 列以显示连接的工作原理。您可以安全地将它们从select 中删除。

proc sql;
  create table stage1 as
  select 
    a.id
  , a.date
  , a.measurement_a
  , b.measurement_b
  , b.date as b_date
  , intck('month', a.date, b.date, 'C') as c_months_apart
  from 
  a left join b 
  on a.id = b.id 
  and intck('month', a.date, b.date, 'C') between 0 and 6
  order by a.id, a.date, b.date
  ;

data want;
  set stage1;
  by id;
  if first.id then time=1; else time+1;
run;

输出(想要)

                   measurement_    measurement_                 c_months_
ID         Date          a               b            b_date      apart      time

 1    20JUN2013        52.3             56         20JUN2013        0          1
 1    20JUN2013        52.3             53         10DEC2013        5          2
 1    12JUL2013        65.6             53         10DEC2013        4          3
 1    28NOV2014        37.4              .                 .        .          4
 1    02DEC2014        61.3              .                 .        .          5
 1    22SEP2015        40.5             40         23SEP2015        0          6
 1    15OCT2015        60.5              .                 .        .          7
 2    03JUN2011        46.5             58         16DEC2011        6          1
 2    19JUL2011        54.1             58         16DEC2011        4          2
 2    29OCT2012        53.6             56         20FEB2013        3          3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多