如何在SAS数据步中按MID统计Method_ALL=1的匹配记录数?
用SAS数据步按MID统计Method_ALL=1的记录数
需求说明
针对包含多个MID值的数据集,按每个MID分组统计:
- 该MID的总记录数(Count_REC)
- 其中Method_ALL等于1的记录数(Match_Count)
要求仅使用SAS数据步实现,不使用PROC SQL。
输入数据示例
MID Method_ALL 334 1 334 0 334 1 334 1 334 1
期望输出结果
MID Method_ALL Count_REC Match_Count 334 0 5 4
SAS数据步实现代码
/* 先按MID排序,确保数据步能按组处理 */ proc sort data=input_data; by MID; run; /* 数据步分组统计 */ data output_summary; set input_data; by MID; /* 保留计数变量,避免每次循环重置 */ retain Count_REC Match_Count 0; /* 每组第一条记录时初始化计数器 */ if first.MID then do; Count_REC = 0; Match_Count = 0; end; /* 累计总记录数 */ Count_REC + 1; /* 统计Method_ALL=1的记录数 */ if Method_ALL = 1 then Match_Count + 1; /* 每组最后一条记录时输出汇总结果 */ if last.MID then do; Method_ALL = 0; output; end; run;
代码说明
- 排序预处理:用
proc sort按MID排序,保证同一MID的记录连续排列,这是数据步by分组处理的必要前提。 - 变量持久化:
retain语句让计数变量在数据步循环中保留上一次的值,不会因读取新记录重置为缺失。 - 分组初始化:
first.MID标记每组第一条记录,此时重置计数器,确保每组统计独立。 - 计数逻辑:
Count_REC + 1自动累计总记录数,初始值默认取retain设置的0。- 仅当
Method_ALL=1时,Match_Count加1,精准统计目标记录数。
- 输出控制:
last.MID标记每组最后一条记录,此时按需求设置Method_ALL为0,输出该组的汇总结果,避免输出原始明细行。
内容的提问来源于stack exchange,提问作者Supraa
相关产品推荐
相关产品推荐

