SAS语言,专门为数据分析和报告处理所涉及的复杂数据操作、图形图表制作、文档创建与输出设计的面向过程的编程语言。
SAS程序是提交给SAS系统执行的一系列步骤(包括DATA和PROC步):
DATA步通常用来读取数据并创建SAS数据集;
PROC步或者程序步通常用于处理SAS数据集;
每一步都有开头和结尾的边界,称之为步边界。SAS基于步边界编译和执行每个独立的步。
注释语句:
注释分为两种类型,一种是块注释,一种是语句注释。其中块注释为任意长度、可以包含分号、不允许嵌套,注释语句要求注释内容是完整的一条语句,不能包含分号。
/*块注释1;
块注释2;*/
*注释语句内容;
SAS逻辑库是一个或者多个SAS文件的组合。这些SAS文件能够被SAS系统识别并且能作为一个单元引用或者存储。
SAS逻辑库的引用是通过定义一个逻辑名字“逻辑库引用名”或者libref来实现的。
SAS系统逻辑库(SAS会话初始化时自动创建,会话结束后自动删除)
临时逻辑库:work
永久逻辑库:sasuser,sashelp...
逻辑库引用语法格式:
libname libref'SAS-library-location',<options>
例如:
libname test'D:\SAS\data'
SAS数据集是一种特定数据结构的文件,以数据表的形式呈现,表中包含变量和观测,其中列可以指变量,行指观测。
SAS数据集的名字是两级名称,包含逻辑库名称,点分隔符和数据集名称:
SAS输入格式informat是SAS系统中的模式集,用于决定如何解析要存入变量列的数据(直接读取或者转换)。
作用:将原始数据(带格式的)转换为SAS数据
输入格式有两种类型,对应两种SAS变量类型:
字符型输入格式,名称前带"$"符号;
数值型输入格式,名称前无"$"符号;
任何输入格式中的“.”点符号是必须的,
语法要求如下:
<$><informat><w>.<d>;
*其中$表示字符输入格式,informat输入格式名称,w总长度,d小数位数
SAS日期输出格式如下表:
读其他数据类型的文件,语法格式如下:
libname libref<engine><path=>"workbook-name"<option(s)>
例如读EXCEL文件:
libname prodx xlsx 'D:\workshop\data\products.xlsx';
*读EXCEL文件,并命名为prodx
libname prodx clear
文本数据访问语法格式:
proc import datafile='path\filename'
dbms=filetype out=out-table<replace>;
<guessingrows=n|MAX;>
run;
proc import datafile='E:\SAS\data.csv'
dbms=csv out=work.storm_damage_import
replace;
run;
proc import datafile='E:\SAS\data.dat'
dbms=dlm out=traffic1 replace;
guessingrows=3000;
delimiter="|"
run;
*dlm表示有分隔符分隔的文件,out存在work路径下
查看全部的逻辑库:
proc contents data=sasuser._all_;
run;
查看单个逻辑库:
proc contents data=sashelp.cars;
run;
打印整个表:
proc print data=sashelp.cars;
run;
对数据描述统计:
proc univariate data=sashelp.cars;
run;
创建统计报表PROC FREQ单因子频数表:
proc freq data=sashelp.cars;
tables Origin Type DriveTrain;
run;
*要求离散型变量
筛选语句:
proc print data=sashelp.cars(obs=10);
var Make Type MSRP MPG_City MPG_Highway Weight;
run;
加入where筛选语句:
proc print data=sashelp.cars(obs=10);
var Make Type MSRP MPG_City MPG_Highway Weight;
where Type = 'SUV' and MSRP <=30000;
run;
数据格式化
语法结构如下:
proc print data=libref.sas-data-set;
format variable(s) format;
run;
示例对weight格式进行处理:
proc print data=sashelp.cars;
var Make Model Type MSRP MPG_City MPG_Highway Weight;
where Type = 'SUV' and MSRP <=30000;
format weight comma8.1;
run;
数据排序,默认升序排列,语法格式如下:
proc sort data=input-sas-data-set
<out=output-sas-data-set>;
by <descending>by-variable(s);
run;
示例:
proc sort data=sashelp.cars
out=cars;
by Make;
run;
多报表展示,分制造商展示:
proc sort data=sashelp.cars
out=cars;
by Make;
run;
proc print data=sashelp.cars;
var Make Model Type MSRP MPG_City MPG_Highway Weight;
where Type = 'SUV' and MSRP <=30000;
format weight comma8.1;
by Make;
run;
set语句创建新数据,语法格式:
data output-sas-data-set;
set input-sas-data-set;
run;
示例:
data cars;
set sashelp.cars;
run;
加入筛选语句格式:
data cars;
set sashelp.cars;
<where where-expression;>
<drop variable-list;>
<keep variable-list>
run;
示例:
data cars;
set sashelp.cars;
where make='Audi' and model contains'A6';
drop MPG_City Wheelbase;
run;
proc print data=cars;
run;
新增计算列,用赋值语句创建新变量:
varibale=expression;
赋值语句表达式,将计算结果赋给一个新的或者存在的变量。
条件处理,语法格式:
if expression then satements;
if expression then satements;
<else if expression then satements;>
<else if expression then satements;>
if expression then satements;
<else if expression then satements;>
<else satements;>
循环语句:
if expression then do;
<executable statements>
end;
else if expression then do;
<executable statement>
end;
else do;
<executable statements>
end;
data work.bonus;
set ORION.sales;
length Freq $12;
if Country='US' then
do;
Bonus=500;
Freq='Once a Year';
end;
else if Country='AU' then
do;
Bonus=300;
Freq='Twice a Year';
end;
run;
proc print data=bouns;
run;
设置数据列标签:
proc print data=sashelp.class label;
var Name Age Weight;
label Name='First Name';
run;
设置标题、题注:
title<n>'text'
footnote<n>'text'
导出数据:
proc export data=sashelp.cars
outfile='e:/cars.txt'
dbms=tab replace;
run;
libname output xlsx'e:\output.xlsx';
data output.class;
set sashelp.class;
replace;
run;
libname output clear;