如何填充缺失值以计算指定日期对应的人员年龄
计算多日期对应的人员年龄(填充缺失值)
我需要计算人员在多个不同日期对应的年龄(以年为单位)。已有每个ID第一条记录的指定日期及对应人员年龄,希望填充后续记录中缺失的年龄值。
原始数据集代码:
data have; input ID date :mmddyy10. age ; format date mmddyy10.; datalines; 1 10/27/2004 21 1 02/04/2006 . 1 12/08/2009 . 2 07/25/2007 24 2 08/31/2008 . 2 08/27/2012 . run;
我尝试了以下代码,但它打乱了我的数据,且仅对每个ID的第一个年龄变量进行了处理。我也曾考虑使用RETAIN语句,但同样没有成功:
data want; set have; by age; if first.id then age1=first.date-date+first.age; run;
解决方案
核心思路是先通过每个ID的第一条记录反推出人员的出生日期,再用后续记录的日期减去出生日期计算对应年龄,具体实现如下:
/* 先处理原始数据,确保日期格式为SAS可识别的日期值 */ data have; input ID date :mmddyy10. age ; format date mmddyy10.; datalines; 1 10/27/2004 21 1 02/04/2006 . 1 12/08/2009 . 2 07/25/2007 24 2 08/31/2008 . 2 08/27/2012 . run; /* 计算并填充缺失年龄 */ data want; set have; by ID; retain birth_date; /* 保留出生日期,跨同一ID的记录传递 */ if first.ID then do; /* 从第一条记录的日期和年龄反推出生日期 */ birth_date = date - age * 365.25; calculated_age = age; /* 第一条记录年龄沿用原值 */ end; else do; /* 后续记录计算年龄:当前日期减出生日期,取整数年 */ calculated_age = int((date - birth_date)/365.25); age = calculated_age; /* 直接替换原缺失的age变量 */ end; format birth_date mmddyy10.; /* 格式化出生日期,便于查看 */ run;
代码要点说明
:mmddyy10.输入格式:让SAS正确解析mm/dd/yyyy格式的日期字符串,转换为可运算的SAS日期值by ID:按ID分组处理,first.ID用于判断当前记录是否为该ID的第一条数据retain birth_date:确保出生日期在同一ID的后续记录中不会被重置为缺失值- 用
365.25计算年龄:考虑闰年的平均天数,比直接用365计算更准确 - 可选择保留原
age变量或直接替换,代码中两种逻辑都有体现
内容的提问来源于stack exchange,提问作者doodledad
相关产品推荐
相关产品推荐

