假设我在 SAS 中有以下两个数据集:
Have_1 - 包含每个 ID 的每月数据:
ID Month
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
Have_2 - 发生特定事件的月份列表:
ID Month_Event
1 4
1 9
我正在尝试将 Month_Event 从 Have_2 合并到 Have_1 上,其中 Month_Event 将为所有 ID 条目填充,其中 Month 小于或等于 Month_Event,即
想要:
ID Month Month_Event
1 1 4
1 2 4
1 3 4
1 4 4
1 5 9
1 6 9
1 7 9
1 8 9
1 9 9
1 10 .
我尝试过以下方法:
proc sql;
create table want as
select a.*, b.Month_Event
from have_1 as a
left join have_2 as b
on a.ID = b.ID and a.Month <= b.Month_Event;
quit;
这几乎给出了所需的输出,唯一的问题是输出不仅提供最近的 Month_Event,而是提供:
ID Month Month_Event
1 1 4
1 1 9
1 2 4
1 2 9
1 3 4
1 3 9
1 4 4
1 4 9
1 5 9
1 6 9
1 7 9
1 8 9
1 9 9
1 10 .
如何相应地调整我的代码以提供所需的输出?
取最小值。
首先让我们将您的列表转换为实际的 SAS 数据集。
data have;
input ID Month ;
cards;
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
;
data have2;
input ID Month_Event ;
cards;
1 4
1 9
;
现在将两者结合起来并取符合条件的最小month_event
proc sql;
create table want as
select a.id,a.month,min(b.month_event) as month_event
from have a left join have2 b
on a.id = b.id
and a.month <= b.month_event
group by a.id, a.month
;
quit;
结果
month_
Obs ID Month event
1 1 1 4
2 1 2 4
3 1 3 4
4 1 4 4
5 1 5 9
6 1 6 9
7 1 7 9
8 1 8 9
9 1 9 9
10 1 10 .