SAS中使用Retain语句按分组统计患者就诊次数的问题求助
问题排查与修正
代码中的核心错误
- RETAIN语句变量错误:你的RETAIN语句重复写了
CtC1Visit,却漏掉了CtC5Visit。这会导致CtC5Visit无法被保留值,在非首次ID的观测中自动重置为缺失,累加时缺失值运算会让所有统计变量最终变成缺失。 - 数据集同名覆盖风险:
data L3; set L3;在同一个数据步读写同名数据集,会直接覆盖原始数据,同时SAS的读写机制可能引发数据处理异常。
修正后的完整代码
首先确保原始数据集按ID排序(未排序时必须执行此步骤):
proc sort data=L3; by ID; run;
然后修改数据步代码:
data wide_L3; /* 更换输出数据集名,避免覆盖原始数据 */ set L3; by ID; /* 修正RETAIN语句,包含所有需要统计的变量 */ retain CtC1Visit CtC2Visit CtC3Visit CtC4Visit CtC5Visit CtC6Visit; if first.ID then do; CtC1Visit = 0; CtC2Visit = 0; CtC3Visit = 0; CtC4Visit = 0; CtC5Visit = 0; CtC6Visit = 0; end; /* 累加各诊所就诊次数,用else if优化逻辑 */ if VisitCode = 1 then CtC1Visit + 1; else if VisitCode = 2 then CtC2Visit + 1; else if VisitCode = 3 then CtC3Visit + 1; else if VisitCode = 4 then CtC4Visit + 1; else if VisitCode = 5 then CtC5Visit + 1; else if VisitCode = 6 then CtC6Visit + 1; if last.ID then output; drop VisitCode; /* 清理不需要的原始字段 */ run;
补充说明
- 必须先对原始数据集按
ID排序,否则first.ID和last.ID的分组逻辑会完全失效。 - 用
else if替代多个独立if,逻辑更严谨(一条就诊记录仅对应一个诊所,不会重复判断)。 - 添加
drop VisitCode可以剔除冗余字段,让输出数据集更简洁。
内容的提问来源于stack exchange,提问作者AH26
相关产品推荐
相关产品推荐

