咨询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
相关产品推荐
相关产品推荐

