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

如何用SAS数组与DO循环基于date_前缀变量创建time_前缀新变量

如何用SAS数组和循环创建对应前缀的新变量并计算日期差

方法一:通过Proc SQL生成变量列表(清晰可控)

这种方法先从SAS数据字典中提取所有date_前缀的变量,生成对应的time_变量列表,确保两个数组的元素完全对应:

/* 第一步:获取date_前缀变量,生成对应的time_变量列表 */
proc sql noprint;
    select tranwrd(name, 'date_', 'time_') into :time_vars separated by ' '
    from dictionary.columns
    where libname='WORK' /* 替换为你的数据集所在库名 */
      and memname='MORBIDITY' /* 替换为你的数据集名,需大写 */
      and upcase(name) like 'DATE_%';
quit;

/* 第二步:用数组循环创建新变量并赋值 */
data morbidity;
    set morbidity;
    array dates date_:; /* 引用所有date_前缀的变量 */
    array times &time_vars.; /* 引用生成的time_前缀变量列表 */
    
    do i = 1 to dim(dates);
        times(i) = dates(i) - ref_date; /* 计算与参考日期的天数差 */
    end;
    
    format times: 11.; /* 给新变量统一设置格式,可选 */
    drop i; /* 清理临时变量 */
run;

方法二:数据步内动态生成变量(简洁高效)

无需额外查询步骤,直接在数据步内通过函数动态获取变量名并创建新变量:

data morbidity;
    set morbidity;
    array dates date_:; /* 引用所有date_前缀的变量 */
    
    do i = 1 to dim(dates);
        /* 获取当前date变量的名称,替换前缀为time_ */
        new_var_name = tranwrd(vname(dates(i)), 'date_', 'time_');
        /* 动态赋值给新生成的time_变量 */
        call symputx('curr_var', new_var_name);
        &&curr_var = dates(i) - ref_date;
    end;
    
    format time_: 11.; /* 统一设置所有time_变量的格式 */
    drop i new_var_name; /* 清理临时变量 */
run;

说明

  • 两种方法均不会修改原date_变量,而是创建全新的time_前缀变量(例如date_amputation对应生成time_amputation)。
  • 方法一适合变量较多、需要明确控制变量列表的场景;方法二更简洁,无需提前了解所有变量后缀。
  • 天数差的计算依赖SAS日期型变量的特性:两个日期相减直接得到天数差。

内容的提问来源于stack exchange,提问作者jackahall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:50:50