☰
SAS入门实战:数据步、清洗与报表输出避坑指南
2026/10/14 4:38:31 网站建设 项目流程

简介:《小白学SAS基础教程》是一份面向零基础读者的SAS入门学习资料,适合对统计分析工具望而却步、又希望快速上手的新手,以及需要提升数据处理效率的职场人士。资源以PDF形式呈现,压缩包内共1个文件,大小约1.76MB,内容围绕数据整理、作图和制表三大部分展开,采用对话体写法,借主人公“小白”的视角逐步引导学习。书中不仅讲解建立数据集的基础与高级议题、常用函数的使用思路,还系统介绍缺失值、异常值、重复数据等清洗方法,并详细说明如何利用SAS绘制常规与非常规图形、生成规范报表。作者强调以解决实际问题为导向,帮助读者理解命令背后的逻辑,而非简单堆砌语法。目前已有707人学习,适合想从零入门SAS、注重实战应用的读者参考。

1. 从零上手 SAS:为什么一本对话体教程能省掉三个月试错

很多人第一次打开 SAS 9.4 中文版,看到资源管理器、编辑器、日志、输出四个窗口并排,第一反应是关掉重开。我见过太多人卡在这一步——不是学不会,是没人告诉他哪个窗口该看、哪个窗口可以忽略。这份《小白学SAS基础教程》解决的就是这个问题:它不按软件菜单顺序讲,而是按“你手头有一堆数据要处理”的真实场景推进。全书围绕数据整理、做图、制表三块展开,配套资源包含书中全部程序(带页码索引)、9 个对应视频,以及两份附录——一份给新手看常见报错和高效写法对比,一份给熟手看如何在 SAS 里调用 R。如果你正在找一条不绕弯的 SAS 入门路径,这份资源值得先下下来对着练。

2. 数据步与程序步:SAS 程序的基本骨架怎么搭

2.1 三句话建立一个数据集

SAS 所有分析都从数据步开始。数据步的核心就三句:data给数据集起名,input声明变量,cards(或datalines)引领数据输入。下面这段代码建立一个包含性别和年龄的临时数据集:

data first; input gender age; cards; 1 30 0 24 ; run;

逻辑说明:data first;在 Work 逻辑库下创建名为 first 的临时数据集。input gender age;告诉 SAS 每行有两个变量,默认以空格分隔。cards;之后是实际数据行,最后单独一行写分号表示数据结束——这个分号必须另起一行,不能跟在最后一条数据后面。run;是程序步结束的标志,数据步虽然不强制要求run,但加上是好习惯。

参数说明:数据集名只能由英文、数字和下划线组成,首字符不能是数字,不超过 32 个字符。变量命名规则相同。如果你确实需要用中文变量名,可以加options validvarname=any;,但实际项目中不建议这么做,后续维护和协作容易出问题。

2.2 临时数据集与永久数据集的差别

Work 逻辑库是 SAS 留给用户的临时空间,关闭 SAS 后自动清空。要让数据留下来,必须指定永久逻辑库。常见做法是用libname语句把某个本地目录映射成逻辑库:

libname mydata 'D:\SAS_Projects\data'; data mydata.first; input gender age; cards; 1 30 0 24 ; run;

逻辑说明:libname mydata 'D:\SAS_Projects\data';把指定路径映射为逻辑库 mydata。之后data mydata.first;建立的数据集就存在这个目录下,关闭 SAS 后文件仍在。参数说明:路径不要用中文,不要用空格,否则在某些 SAS 版本下会报错。逻辑库名同样遵循 32 字符限制。

2.3 从外部文件导入数据的常见做法

数据量大的时候,没人会在编辑器里手敲cards。我一般会先把数据整理成 CSV 或 Excel,再用proc import导入:

proc import datafile="D:\SAS_Projects\data\raw.csv" out=mydata.raw dbms=csv replace; getnames=yes; run;

逻辑说明:datafile指定源文件路径,out指定输出数据集,dbms=csv声明文件类型,replace表示如果数据集已存在就覆盖,getnames=yes表示第一行作为变量名。参数说明:如果源文件是 Excel,dbms改为xlsx,并且需要确认 SAS 安装了 PC Files Server 或者对应引擎。导入后务必用proc contents data=mydata.raw; run;检查变量类型和长度,SAS 自动判断类型时经常把本该是字符的编号读成数值,后面合并数据时就会翻车。

3. 数据清洗三大件:重复值、缺失值、异常值怎么批量处理

3.1 查找和删除重复值

重复值是数据清洗里最先要处理的。SAS 里用proc sort的nodupkey选项最直接:

proc sort data=mydata.raw nodupkey; by id; run;

逻辑说明:nodupkey按by变量排序的同时删除重复记录,只保留第一条。参数说明:by id;指定判断重复的依据变量。如果只想查找不想删除,可以先用proc freq看频次:

proc freq data=mydata.raw noprint; tables id / out=dup_check; run;

逻辑说明:noprint抑制输出窗口的频次表,out=dup_check把结果输出到数据集,其中count列大于 1 的就是重复值。参数说明:tables id指定检查变量,多个变量用空格隔开。

3.2 查找缺失值的万能程序思路

缺失值排查是体力活,但可以用数组写一个通用程序。下面这段代码检查所有数值型变量的缺失情况:

data check_missing; set mydata.raw; array num_vars _numeric_; array miss_flag(100) $1 _temporary_; do over num_vars; if num_vars = . then miss_flag(_i_) = 'Y'; else miss_flag(_i_) = 'N'; end; total_miss = 0; do over miss_flag; if miss_flag = 'Y' then total_miss + 1; end; run;

逻辑说明:array num_vars _numeric_;自动把所有数值型变量纳入数组。_temporary_数组不写入输出数据集,只做临时标记。do over循环遍历数组元素,_i_是数组索引。最后统计每行缺失变量总数。参数说明:miss_flag(100)中的 100 要大于等于数值变量个数,否则会报数组越界。字符型变量缺失判断用if var = ' ' then,需要单独处理。

3.3 异常值检测与 if/where 的区别

异常值检测常见做法是用proc univariate看四分位距,或者直接按业务规则筛选。这里重点说一个高频踩坑点:if和where的区别。

data subset_if; set mydata.raw; if age > 100 then delete; run; data subset_where; set mydata.raw; where age <= 100; run;

逻辑说明:if在数据步执行过程中逐行判断,可以配合delete语句删除记录,也可以用来赋值。where在读取数据之前就过滤,效率更高,但不能用来创建新变量。参数说明:where后面不能跟if里那种赋值语句,只能写条件表达式。如果条件里用到自动变量(如_n_),只能用if。

4. 避坑与排查:SAS 新手最容易翻车的五个地方

4.1 日志窗口报红但找不到错误行

现象:程序提交后日志窗口一片红,但错误信息指向的行号和你编辑器里的行号对不上。原因:SAS 日志里的行号是相对于最近一次提交的程序块,如果你选中部分语句执行,行号会重新计数。解决:每次提交前先清空日志窗口(Ctrl+E然后Ctrl+Del),或者养成整段提交的习惯。另外,日志里ERROR和WARNING要分开看,WARNING不一定导致程序中断,但可能让结果不可信。

4.2 数据集名和变量名用了中文导致报错

现象:data 数据集;提交后日志提示“无效的 SAS 名称”。原因:SAS 默认不支持中文数据集名和变量名。解决:坚持用英文加下划线命名。如果确实需要中文标签,用label语句给变量加标签,输出时显示中文,但变量名本身保持英文。

4.3 导入 CSV 后数值型变量变成字符型

现象:proc means对某个变量求均值时报错“变量必须是数值型”。原因:CSV 里该列混入了空格、逗号或非数字字符,SAS 自动判断为字符型。解决:导入后用proc contents检查类型,如果是字符型但本应是数值,用input函数转换:

data fix_type; set mydata.raw; new_var = input(char_var, best12.); drop char_var; run;

逻辑说明:input(char_var, best12.)把字符型转成数值型,best12.是宽度格式。参数说明:如果原字符里有千分位逗号,先用compress(char_var, ',')去掉逗号再转换。

4.4 merge 合并后记录数对不上

现象:两个数据集用merge合并,结果行数比预期多。原因:merge默认按by变量匹配,如果某个数据集里by变量有重复值,会产生笛卡尔积。解决:合并前先用proc sort nodupkey确认by变量唯一,或者改用proc sql的 join 并明确指定连接条件。

4.5 输出结果中文乱码

现象:输出窗口或结果查看器里中文显示为方框或乱码。原因:SAS 会话的编码设置和系统编码不一致。解决:在启动 SAS 时加-encoding utf8参数,或者在程序开头加options locale=zh_CN;。如果结果要输出到 PDF 或 Word,还要确认 ODS 目标的编码设置。

5. 从制表到出图:把结果直接变成能交差的报表

5.1 用 tabulate 制作标准三线表

三线表是很多行业报表的默认格式。proc tabulate配合ods可以输出接近期刊要求的三线表:

ods pdf file="D:\SAS_Projects\output\table.pdf" style=journal; proc tabulate data=mydata.raw; class gender; var score; table gender, score*(n mean std); run; ods pdf close;

逻辑说明:ods pdf把结果输出为 PDF,style=journal使用接近学术期刊的样式。table gender, score*(n mean std);表示行是 gender,列是 score 的样本量、均值和标准差。参数说明:style=journal是 ODS 内置样式之一,其他常用样式还有analysis、statistical。如果要输出到 Word,把pdf换成rtf,文件扩展名相应改为.rtf。

5.2 用 proc sgplot 绘制双坐标轴图

双坐标轴图在展示两个量纲不同的指标时很实用:

proc sgplot data=mydata.raw; vbar month / response=sales y2axis; series x=month y=profit / y2axis; xaxis label="月份"; yaxis label="销售额"; y2axis label="利润"; run;

逻辑说明:vbar画柱状图,series画折线图,y2axis指定使用右侧坐标轴。参数说明:xaxis、yaxis、y2axis分别设置三个轴的标签。如果柱子和折线重叠影响阅读,可以加transparency=0.3给柱子设置透明度。

5.3 用 proc template 定制绘图模板

proc template是 SAS 绘图中最容易被忽略但最强大的工具。下面这段代码定义一个简单的自定义样式:

proc template; define style mystyle; parent = styles.journal; style GraphFonts / 'GraphDataFont' = ("Microsoft YaHei", 9pt) 'GraphTitleFont' = ("Microsoft YaHei", 12pt, bold); end; run;

逻辑说明:parent = styles.journal继承内置样式,然后覆盖字体设置。GraphDataFont控制数据标签字体,GraphTitleFont控制标题字体。参数说明:字体名要用系统里已安装的字体,中文环境建议用“Microsoft YaHei”或“SimSun”。定义好之后在ods语句里用style=mystyle引用。

5.4 把结果输出到 Excel 并保留格式

很多场景下最终交付物是 Excel 文件。用ods excel可以直接输出:

ods excel file="D:\SAS_Projects\output\report.xlsx" options(sheet_name="汇总" embedded_titles="yes"); proc means data=mydata.raw n mean std; class gender; var score; run; ods excel close;

逻辑说明:sheet_name指定工作表名,embedded_titles控制是否把标题嵌入表格。参数说明:如果要输出多个工作表,可以在proc步之间用ods excel options(sheet_name="新表名");切换。注意ods excel需要 SAS 9.4 及以上版本,且安装了对应模块。

5.5 一个我反复用的验证习惯

每次做完制表或绘图,我不会直接看输出结果就交差。我会先跑一遍proc contents确认数据集结构,再跑一遍proc print看前 10 行原始数据,最后才看格式化后的报表。这个习惯帮我拦下过很多次“变量标签写错”“观测值被 where 条件误删”的问题。从那以后我每次交付报表前都强制走一遍这个流程,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询