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

SAS中使用Retain语句按分组统计患者就诊次数的问题求助

问题排查与修正

代码中的核心错误

  1. RETAIN语句变量错误:你的RETAIN语句重复写了CtC1Visit,却漏掉了CtC5Visit。这会导致CtC5Visit无法被保留值,在非首次ID的观测中自动重置为缺失,累加时缺失值运算会让所有统计变量最终变成缺失。
  2. 数据集同名覆盖风险: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:29:55