You need to enable JavaScript to run this app. 咨询SAS中依托proc freq按表单、题号分组计算单题正确率的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

咨询SAS中依托proc freq按表单、题号分组计算单题正确率的实现方法

SAS 基于PROC FREQ实现分表单分题目正确率统计的实现方案

核心实现逻辑

正确率的本质是指定分组(单个表单下的单道题目)内,作答正确(Scores=1)的记录数占该分组总有效作答记录数的比例,PROC FREQ的交叉计数功能完全适配该需求,无需手动编写逐行累加的计数逻辑,且对大规模长表数据的处理效率更高。

具体实现步骤

1. 字段预处理

原表中Question Number为带空格的字段名,可提前重命名为无空格的QuestionNumber,简化后续代码的字段引用逻辑:

data onetable_clean;
    set onetable;
    * 适配SAS对带空格字段的引用语法,完成字段重命名;
    rename 'Question Number'n = QuestionNumber;
run;

2. 调用PROC FREQ生成分组计数基础数据集

proc freq data=onetable_clean;
    * 交叉维度为表单、题目编号、作答得分;
    * sparse参数强制输出所有分组组合,避免全错题目(无Scores=1记录)被漏算;
    * noprint参数关闭统计表格的屏幕输出,减少日志冗余、节省资源;
    tables Form * QuestionNumber * Scores /
        out=freq_raw
        sparse
        noprint;
run;

该步骤生成的freq_raw数据集,会存储每个(Form, QuestionNumber, Scores)组合对应的记录数、占比值,完全不受原表中数据存储顺序(先存全量A表单数据、再存全量B表单数据)的影响,可自动识别所有分组维度完成计数。

3. 整理输出符合要求的结果表

从基础计数结果中筛选出作答正确的分组记录,换算为0-1区间的正确率值,匹配要求的字段结构:

data final_result (keep=Form QuestionNumber QuestionPercent);
    set freq_raw;
    * 仅保留作答正确(Scores=1)的分组统计结果;
    where Scores = 1;
    * PROC FREQ默认输出的百分比为0-100区间值,除以100即可得到0-1区间的正确率;
    QuestionPercent = Percent / 100;
    * 格式设置与示例保持一致,保留两位小数;
    format QuestionPercent 4.2;
run;

关键注意事项

  • 若存在某道题目无任何正确作答的情况,依靠步骤中设置的sparse参数,系统会自动生成对应行、正确率赋值为0,不会出现结果漏项
  • 若业务上需要将Scores的缺失值纳入总作答数统计,可在proc freq语句中追加missing参数即可
  • 处理150道题、单题大量作答记录的长表场景时,PROC FREQ的计数性能优于手动DATA步累加逻辑,无需担心数据量带来的运行效率问题
  • 最终输出的final_result表结构完全匹配要求:包含Form(表单)、QuestionNumber(题目编号)、QuestionPercent(题目正确率)三类字段,与示例结果的格式、统计逻辑一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 16:45:09