You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何填充缺失值以计算指定日期对应的人员年龄

计算多日期对应的人员年龄(填充缺失值)

我需要计算人员在多个不同日期对应的年龄(以年为单位)。已有每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:01:24