SAS-创建基于最小差异日期的唯一邂逅
问题描述:
我想从表2中关闭日期与表2中最接近的日期(如果存在)对两个表中的数据进行排序。表1中可能有ID-date,表2中没有匹配,反之亦然。不保证是1:1的比赛。对于例如从T1我的数据会是这样的:SAS-创建基于最小差异日期的唯一邂逅
ID time1
A 01/09/2015
A 02/16/2015
B 03/03/2015
C 04/01/2015
C 01/20/2015
C 03/15/2015
T2相似:
ID time2
A 01/29/2015
A 02/19/2015
B 03/06/2015
C 01/27/2015
C 03/18/2015
C 04/04/2015
的ID加入的时候,我不想要的是独一无二的所有日期的组合,而这些组合中两者之间的天数最小,例如。
desired_output:
ID date_time1 date_time2
A 01/09/2015 01/29/2015
A 02/16/2015 02/19/2015
B 03/03/2015 03/06/2015
C 01/20/2015 01/27/2015
C 03/15/2015 03/18/2015
C 04/01/2015 04/04/2015
我不知道如何做到这一点,我已经试过选择最大值和最小值,但只给出了类似的东西,这不是我想要的:
ID date_time1 date_time2
A 01/09/2015 02/19/2015
B 03/03/2015 03/06/2015
C 01/20/2015 04/04/2015
任何想法/建议如何做到这一点将不胜感激!谢谢!
答
我使用了两个内置的SAS数据集作为示例,但这里的一般想法是,您要比较t1
中的组中的每个日期与t2
中的同一id组中的每个日期,确定最小日期差异,并只保留那一个。
data t1 (keep = id date rename = date = time1);
set sasuser.admitjune;
if mod(_n_, 2) = 0 then id = "A";
else id = "B";
run;
data t2 (keep = id date rename = date = time2);
set sasuser.admitjune;
if mod(_n_, 2) = 0 then id = "B";
else id = "A";
date = date + 3; /*adjusting the dates so the datasets aren't the same*/
run;
要做到这一点,你按升序排序的日期差异和nodup只保留最近的一个:
proc sql;
create table desired_output as select
a.id, a.time1, b.time2 as nearest_time2,
abs(b.time2-a.time1) as diff
from t1 as a
left join t2 as b
on a.id = b.id and b.time2 > a.time1
group by a.id, a.time1
order by calculated diff;
proc sort nodupkey; by id time1;
quit;
你可能要一个'和b.time2> a.time1'您连接条件以确保'time2'事件在'time1'事件之后。 –
我改变了一点说明,因为我觉得我不清楚自己想要做什么。我试图对两个表中的数据进行排序,将表1中的关闭日期与表2中最近的日期(如果存在)配对。但是这是一个很好的补充Chris J. – Brad
因此,最接近的,你希望最接近的*下面的*日期(即,date2必须晚于date1)? – superfluous