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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:45:31