如何基于SAS现有带日期后缀的code22变量创建对应status22变量?
SAS:仅为数据集中现有code22_&yymmdd变量创建对应status22_&yymmdd变量
现有代码在指定日期范围循环生成数组时,会尝试引用该范围内不存在的code22_&yymmdd变量,导致报错。需要调整逻辑,只针对数据集中实际存在的code22_开头且日期在指定范围内的变量,创建对应的status22_&yymmdd变量。
解决方案思路
- 从输入数据集
have中提取所有以code22_开头的变量名,解析出日期后缀 - 筛选出日期落在
from和to参数指定范围内的变量 - 基于筛选后的变量列表,动态生成对应的
status22_变量和数组,避免引用不存在的变量
修改后的完整代码
data have; call streaminit(20230221); do id = 1 to 100; length code22_230101-code22_230131 code22_230201-code22_230228 $2 bwght0-bwght80 8; array code22 code22_:; array bwght22loop bwght:; do over code22; code22 = put(rand('integer',1,12),2.-L); end; do over bwght22loop; bwght22loop = put(rand('integer',1,12),2.-L); end; output; end; run; proc format; value $ code_to_status (default=2) '1','2','3','4' = 'R ' Other = 'NR' ; run; %macro example(from, to); %local from_date to_date code_vars status_vars; /* 将输入的日期字符串转换为SAS日期值 */ %let from_date = %sysfunc(inputn(&from,yymmdd8.)); %let to_date = %sysfunc(inputn(&to,yymmdd8.)); /* 从数据集中提取所有code22_开头的变量,并筛选日期在指定范围内的 */ proc sql noprint; select name into :code_vars separated by ' ' from dictionary.columns where libname = 'WORK' and memname = 'HAVE' and upcase(name) like 'CODE22_%' and input(substr(name,8),yymmdd6.) between &from_date and &to_date; quit; /* 生成对应的status22_变量名列表 */ %let status_vars = %sysfunc(tranwrd(&code_vars,code22_,status22_)); data want; set have; /* 仅使用筛选后的code22变量创建数组 */ array code22 &code_vars; /* 定义对应status变量的长度 */ length &status_vars $2; /* 创建status变量数组 */ array status22 &status_vars; do over code22; status22 = put(code22, $code_to_status.); end; run; %mend; %example(20230115,20230214);
代码说明
- 通过
proc sql查询dictionary.columns系统表,精准获取WORK.HAVE中符合前缀和日期范围要求的code22_变量 - 用
tranwrd函数批量生成对应的status22_变量名,无需手动逐个编写 - 数组定义和赋值仅针对筛选后的有效变量,彻底避免引用不存在的变量引发的错误
内容的提问来源于stack exchange,提问作者lydias
相关产品推荐
相关产品推荐

