如何判断Dataset2的date1是否在Dataset1日期区间并合并value字段?
SAS数据集匹配:判断日期区间并合并字段
现有数据集
Dataset1
data Dataset1; input date1 :date09. date2 :date09.; format date1 date9. date2 date9.; cards; 10FEB2014 16FEB2014 10MAR2014 16MAR2014 19MAY2014 25MAY2014 02JUN2014 08JUN2014 ;run;
Dataset2
data Dataset2; input date1 :date09. value; format date1 date9.; cards; 12FEB2014 4 11MAR2014 3 24MAY2014 1 07JUN2014 0 ;run;
需求
判断Dataset2中的date1是否处于Dataset1对应行的date1至date2区间内,若是则将Dataset2的value字段添加到Dataset1中,生成如下目标数据集:
目标Dataset3
data Dataset3; input date1 :date09. date2 :date09. value; format date1 date9. date2 date9.; cards; 10FEB2014 16FEB2014 4 10MAR2014 16MAR2014 3 19MAY2014 25MAY2014 1 02JUN2014 08JUN2014 0 ;run;
解决方案
从示例数据来看,两个数据集的行是一一对应的,因此可以通过行号匹配的方式实现需求,以下提供两种可行方法:
方法一:DATA步合并
通过添加临时行号变量,匹配对应行后判断日期区间:
/* 为两个数据集添加行号变量 */ data ds1; set Dataset1; row = _n_; run; data ds2; set Dataset2; row = _n_; run; /* 合并并判断日期区间 */ data Dataset3; merge ds1 ds2; by row; /* 检查Dataset2的date1是否在Dataset1的日期区间内 */ if ds2.date1 >= ds1.date1 and ds2.date1 <= ds1.date2 then value = ds2.value; /* 保留日期格式 */ format date1 date9. date2 date9.; drop row; /* 删除临时行号变量 */ run;
方法二:PROC SQL实现
利用monotonic()函数获取行号,匹配对应行并通过case语句判断赋值:
proc sql; create table Dataset3 as select d1.date1, d1.date2, case when d2.date1 between d1.date1 and d1.date2 then d2.value else . end as value from Dataset1 d1 inner join Dataset2 d2 on monotonic() = monotonic() order by d1.date1; quit; /* 为结果数据集添加日期格式 */ proc datasets lib=work nolist; modify Dataset3; format date1 date9. date2 date9.; run; quit;
说明
- 如果实际数据的行对应关系并非按顺序排列,需要根据业务逻辑确定其他匹配字段(如月份、业务ID等),替换行号匹配逻辑即可。
- 上述代码中,若Dataset2的
date1不在对应区间内,value字段会赋值为缺失值(.),可根据需求调整处理逻辑。
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

