如何统计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
相关产品推荐
相关产品推荐

