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

在SAS中按ID统计QC列‘FAIL’出现次数的实现需求及代码

修正SAS代码:按ID统计QC列"FAIL"出现次数

原代码的问题

  • 分组逻辑错误:用first.qc无法实现按ID分组统计,应该用first.ID控制每个ID的计数重置
  • 未过滤目标值:没有判断QC是否为"FAIL"就计数,完全不符合需求
  • 计数器跨ID累加:仅靠retain count 0未配合ID分组重置,会导致所有ID的次数混乱累加
  • 直接覆盖原始数据集:修改原始数据存在丢失风险,建议输出到新数据集

正确实现代码

场景1:每条记录显示对应ID的FAIL总次数

如果需要保留所有原始记录,同时每条记录都带上该ID的FAIL累计次数,使用这段代码:

/* 先按ID排序(若数据集未按ID排序)*/
proc sort data=dataset out=sorted_dataset;
    by ID;
run;

data fail_count_all;
    set sorted_dataset;
    by ID;
    retain fail_count 0;
    
    /* 遇到新ID时重置计数器 */
    if first.ID then fail_count = 0;
    /* 仅当QC为FAIL时计数(转大写避免大小写匹配问题)*/
    if upcase(QC) = "FAIL" then fail_count + 1;
run;

场景2:仅输出每个ID的FAIL次数汇总

如果只需要每个ID对应的总次数,不需要保留所有原始记录,使用这段代码:

proc sort data=dataset out=sorted_dataset;
    by ID;
run;

data fail_count_summary;
    set sorted_dataset;
    by ID;
    retain fail_count 0;
    
    if first.ID then fail_count = 0;
    if upcase(QC) = "FAIL" then fail_count + 1;
    
    /* 仅输出每个ID的最后一条记录,此时fail_count为该ID的总次数 */
    if last.ID then do;
        keep ID fail_count;
        output;
    end;
run;

关键逻辑说明

  • by ID:告知SAS按ID分组处理数据
  • retain fail_count 0:让计数器在数据步循环中保持上一次的值,不会每次迭代都重置为0
  • if first.ID then fail_count = 0:每个ID的第一条记录进入时清零计数器,确保每个ID单独统计
  • upcase(QC):统一转换为大写,避免因QC值为"fail"或"Fail"导致统计遗漏
  • if last.ID then output:仅在每个ID的最后一条记录时输出,此时的fail_count即为该ID的FAIL总次数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:51:00