如何在PROC SQL中按条件统计多变量缺失值并汇总至单表?
批量统计SAS数据集中多组分类-数值变量的缺失值数量
针对你的需求,这里提供两种高效的批量处理方案,解决单变量查询重复执行的问题,同时避免子查询返回重复行的问题:
方案一:PROC SQL 子查询批量统计(结果为单行多列)
如果希望结果表以一行多列的形式呈现(每个类别对应一个列,存储缺失值数量),可以用独立子查询配合WHERE 1=0限制主查询返回行数:
PROC SQL; CREATE TABLE missing_summary AS SELECT -- 第一组:飞行支出 (SELECT NMISS(UtgUtl_FlygSSEK_Pers) FROM IBIS3_5 WHERE Exkl_UtgUtl_Flyg=1) AS Flyg_missing, -- 第二组:公交支出 (SELECT NMISS(UtgUtl_BussSSEK_Pers) FROM IBIS3_5 WHERE Exkl_UtgUtl_Buss=1) AS Buss_missing, -- 依次添加剩余18组变量,格式同上 (SELECT NMISS(UtgUtl_TågSSEK_Pers) FROM IBIS3_5 WHERE Exkl_UtgUtl_Tåg=1) AS Tåg_missing FROM IBIS3_5 WHERE 1=0; -- 强制主查询不返回原始数据行,仅保留子查询的统计结果 QUIT;
说明
- 每个子查询独立统计对应类别(分类变量=1)下数值变量的缺失数
WHERE 1=0确保最终结果仅生成一行,避免原始数据集每行重复输出统计值
方案二:DATA步数组批量处理(结果为多行单列)
如果变量命名有规律,且希望结果表以多行单列的形式呈现(每行对应一个类别和缺失数),用数组遍历会更灵活:
DATA missing_summary; LENGTH category $30 missing_count 8; SET IBIS3_5 END=eof; -- 定义数组:分别存放所有分类变量和对应的数值变量 ARRAY exkl_vars[20] Exkl_UtgUtl_Flyg Exkl_UtgUtl_Buss Exkl_UtgUtl_Tåg ...; -- 补全20个分类变量 ARRAY utg_vars[20] UtgUtl_FlygSSEK_Pers UtgUtl_BussSSEK_Pers UtgUtl_TågSSEK_Pers ...; -- 对应20个数值变量 RETAIN cnt1-cnt20 0; -- 初始化并保留计数变量 DO i=1 TO 20; -- 仅统计分类变量=1的观测中,数值变量的缺失情况 IF exkl_vars[i] = 1 THEN DO; IF MISSING(utg_vars[i]) THEN cnt[i] + 1; END; END; -- 遍历完所有观测后,输出每个类别的统计结果 IF eof THEN DO; DO i=1 TO 20; category = VNAME(exkl_vars[i]); -- 获取分类变量名作为类别标识 missing_count = cnt[i]; OUTPUT; END; STOP; END; KEEP category missing_count; -- 仅保留需要的列 RUN;
说明
- 数组
exkl_vars和utg_vars需按顺序一一对应,确保每组分类变量和数值变量匹配 RETAIN语句用于累计每个类别的缺失数,避免每次循环重置- 数据集结束时(
eof=1)输出所有类别的统计结果,最终得到20行的汇总表
为什么之前的子查询方案失败?
如果直接在SELECT子句中嵌套子查询但未限制主查询的返回行,主查询会遍历原始数据集的每一行,导致子查询的统计值被重复输出(每行都显示相同的统计结果)。通过WHERE 1=0(方案一)或用DATA步数组累计(方案二),可以避免这个问题。
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

