如何用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
相关产品推荐
相关产品推荐

