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

如何统计SAS字符型变量缺失值?现有代码仅支持数值型

解决SAS中同时统计数值型与字符型变量缺失值的问题

现有SAS宏代码%task_Oct仅能统计数值型变量的缺失值,无法处理字符型变量——因为proc summary仅支持数值型变量的缺失值统计,导致输出表_final_Alpha只展示数值型变量的缺失值数量。需求是让该表同时展示所有变量(含字符型)的绝对缺失值数。

问题出在这段仅处理数值型变量的代码:

proc summary data=&set;
    var _numeric_;
    output out=smry nmiss=;
run;

proc transpose data=smry(drop=_type_ _freq_) out=smry_;
run;

字符型变量缺失值的等价处理代码

按照你提出的「分别统计数值型、字符型变量缺失值再合并」的思路,以下两种方法可实现字符型变量缺失值统计:

方法1:PROC SQL直接统计(推荐)

利用SAS元数据字典dictionary.columns筛选字符型变量,直接计算每个变量的缺失值数量:

proc sql noprint;
    create table smry_char as
    select name as tablevar,
           sum(case when missing(&set..name) then 1 else 0 end) as miss
    from dictionary.columns
    where libname = upcase(scan("&set.",1,'.')) 
      and memname = upcase(scan("&set.",2,'.'))
      and type = 'char'
    group by name;
quit;

方法2:PROC SUMMARY配合数组处理

通过数组遍历所有字符型变量,再转置得到缺失值统计结果:

proc summary data=&set nway;
    output out=smry_char_temp (drop=_type_ _freq_);
    array chars _character_;
    do over chars;
        nmiss_count = nmiss(chars);
        output;
    end;
run;

proc transpose data=smry_char_temp(keep=chars nmiss_count) out=smry_char;
    id chars;
    var nmiss_count;
run;

data smry_char;
    set smry_char;
    tablevar = _name_;
    miss = col1;
    keep tablevar miss;
run;

整合后的完整宏代码

将数值型与字符型缺失值统计结果合并,再整合变量属性、水平数信息,最终得到包含所有变量缺失值的表:

%macro task_Oct(set);
    /* 获取变量属性信息 */
    proc contents data=&set out=con_(rename=(name=tablevar));
    run;

    /* 统计数值型变量缺失值 */
    proc summary data=&set;
        var _numeric_;
        output out=smry_num nmiss=;
    run;

    proc transpose data=smry_num(drop=_type_ _freq_) out=smry_num_;
    run;

    data smry_num_;
        set smry_num_;
        tablevar = _name_;
        miss = col1;
        keep tablevar miss;
    run;

    /* 统计字符型变量缺失值(采用PROC SQL方法) */
    proc sql noprint;
        create table smry_char as
        select name as tablevar,
               sum(case when missing(&set..name) then 1 else 0 end) as miss
        from dictionary.columns
        where libname = upcase(scan("&set.",1,'.')) 
          and memname = upcase(scan("&set.",2,'.'))
          and type = 'char'
        group by name;
    quit;

    /* 合并数值型与字符型缺失值结果 */
    data smry_all;
        set smry_num_ smry_char;
    run;

    /* 获取变量不同水平数 */
    proc freq nlevels data = &set;
        ods output nlevels=distinct;
    run;

    /* 排序所有中间表,用于合并 */
    proc sort data=smry_all;
        by tablevar;
    run;

    proc sort data=distinct;
        by tablevar;
    run;

    proc sort data=con_(keep=tablevar type);
        by tablevar;
    run;

    /* 合并所有信息,生成最终表 */
    data final_Alpha (keep=TableVar distinct_ TYPE miss);
        merge distinct(rename=(Nlevels=distinct_)) con_ smry_all;
        by tablevar;
    run;

    /* 按缺失值降序排序输出最终结果表 */
    proc sort data=final_Alpha out=_final_Alpha;
        by descending miss;
    run;

    /* 输出变量水平数详情 */
    ods select nlevels;
    proc freq nlevels data=&set;
        tables _all_;
    run;
%mend task_Oct;

/* 调用宏测试,替换为你的数据集名即可 */
%task_Oct(sashelp.cars)

关键修改说明

  • 将原单一的缺失值统计拆分为数值型(smry_num_)和字符型(smry_char)两个独立统计步骤
  • 合并两类缺失值结果后,再与变量属性表、水平数表合并,确保所有变量都能出现在最终输出表_final_Alpha中
  • 采用proc sql方法统计字符型缺失值,代码更简洁且无需转置操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:40:27