SAS中如何应用自定义PROC FORMAT格式化PROC FREQ输出列
实现方法说明
第一步:修正原有自定义格式的缺陷
你目前编写的proc format代码存在两个可运行性问题,调整后可直接匹配你的需求:
- 原
count格式缺少大于4值的匹配分支,会导致≥5的频数显示异常 - 原
pcnt格式对0值的输出设置为'-',和你“0值显示为'0'”的需求不匹配
修正后的完整格式定义代码:
proc format; * 频数格式:0-4范围输出<5,其余值正常显示整数; picture count (round) 0-4 = '<5' (NOEDIT) other = '0000009'; * 百分比格式:0值输出0,其余值保留1位小数带百分号; picture pcnt (round) 0 = '0' (NOEDIT) other = '009.9%'; run;
第二步:格式应用(无需额外编写数据步加工)
SAS中自定义格式不需要手动在数据步修改原始数值,只需要将格式和对应统计量关联即可直接生效,分两种常用场景:
- 直接在PROC FREQ的屏幕输出中生效
在原有PROC FREQ代码块中增加FORMAT语句,关联FREQ过程自动计算的count(频数)和percent(百分比)变量即可:proc freq data=have; table area*dz/ list nocum; * 关联自定义格式到对应统计列; format count count. percent pcnt.; run; - 需要将FREQ结果导出为数据集再加工报表时
先通过out=选项将FREQ统计结果输出到自定义数据集,之后在数据步/打印步骤中关联格式即可,不需要把数值手动转成字符类型:* 导出FREQ统计结果到数据集; proc freq data=have; table area*dz/ list nocum out=freq_result; run; * 打印结果时自动套用格式; proc print data=freq_result noobs; format count count. percent pcnt.; run;
注意事项
- 相比手动在数据步写
if count <5 then freq_text='<5'的转值方式,自定义picture格式不会改动原始数值的存储属性,后续如果需要基于原始频数做二次统计计算,不需要反向转换文本值 - 格式定义中的
NOEDIT选项必须紧跟在自定义输出字符串的括号中,否则会出现语法报错 - 你示例中的数据集实际频数最大为3,按照格式规则会全部显示为
<5,0值的百分比也会按需求显示为0,和预期一致。
内容的提问来源于stack exchange,提问作者PriyamK
相关产品推荐
相关产品推荐

