如何在SAS中基于最小/最大日期填充缺失的FROM_NEW与TO_NEW字段
解决SAS数据集缺失日期的填充方案
嘿,我来帮你搞定这个SAS数据集的缺失日期填充问题!结合你说的两个具体场景,我整理了一套清晰的解决方案,咱们一步步来:
核心填充逻辑回顾
先把你提到的规则再明确下,避免理解偏差:
- 缺失
FROM_NEW(第2行):先找到同一ADM分组下TOS="FAC_IP"最后一行的TO_NEW,再在PRO_IP的日期里找大于该日期的最小日期来填充 - 缺失
TO_NEW(第25行):先找到同一ADM分组下TOS="FAC_IP"最后一行的FROM_NEW,再在PRO_IP的日期里找小于该日期的最大日期来填充
具体SAS实现代码
我用PROC SQL结合子查询来实现,逻辑清晰还方便分组匹配,你直接替换成你的数据集名称就能用:
/* 第一步:先提取每个ADM下TOS="FAC_IP"最后一行的日期信息 */ proc sql; create table adm_fac_last as select ADM, /* 取FAC_IP组最后一行的FROM_NEW(用max是默认按日期排序的最后一行) */ max(case when TOS='FAC_IP' then FROM_NEW else . end) as fac_last_from format=date9., /* 取FAC_IP组最后一行的TO_NEW */ max(case when TOS='FAC_IP' then TO_NEW else . end) as fac_last_to format=date9. from your_raw_dataset /* 替换成你的原始数据集名称 */ group by ADM; quit; /* 第二步:针对缺失字段做填充 */ proc sql; create table filled_dataset as select a.*, /* 填充缺失的FROM_NEW:匹配PRO_IP中大于fac_last_to的最小日期 */ case when a.FROM_NEW is missing then (select min(b.PRO_IP) from your_raw_dataset b where b.ADM = a.ADM and b.PRO_IP > c.fac_last_to) else a.FROM_NEW end as FROM_NEW_filled format=date9., /* 填充缺失的TO_NEW:匹配PRO_IP中小于fac_last_from的最大日期 */ case when a.TO_NEW is missing then (select max(b.PRO_IP) from your_raw_dataset b where b.ADM = a.ADM and b.PRO_IP < c.fac_last_from) else a.TO_NEW end as TO_NEW_filled format=date9. from your_raw_dataset a left join adm_fac_last c on a.ADM = c.ADM; quit;
额外说明(针对特殊情况)
如果你的数据集里TOS="FAC_IP"的最后一行不是按日期大小判断,而是按原始数据的行顺序,那可以先给数据集加行号再筛选:
data dataset_with_row; set your_raw_dataset; by ADM; if first.ADM then row_num=0; row_num+1; run;
之后在第一个PROC SQL里,用row_num的最大值来定位FAC_IP的最后一行即可。
内容的提问来源于stack exchange,提问作者user1238178
相关产品推荐
相关产品推荐

