一.建立数据集的基础和高级议题
从最简单的建立SAS数据集开始,逐步深入,介绍如何产生新变量、如何对数据集中的变量进行修饰、如何合理地运用输入和输出格式来完成一些实际工作。
二.介绍部分函数。
不仅是介绍函数本身,更重要的是介绍函数的使用思路,介绍如何应用函数来处理实际问题,而这正是目前国内大部分书中所缺乏的。
三.介绍数据集处理过程
如何查找重复值、异常值、缺失值等,这是所有数据的必需过程。行数据清洗。
四.SAS做图。
五.SAS制表。
不仅介绍了常规的制表程序,而且介绍了很多高级的深入用法,如对表格的详细修饰,将表格直接输出为标准的三线表等。
一.建立数据集的基础和高级议题
1.多个产品的集合
SAS是个系统,所以它不只是个统计软件,而是多个产品的集合
2.界面
3.功能
4.运行方式
5.程序构成
6.建立数据集
SAS中建立数据集主要有两种方式:直接输入数据,另一种是把数据从别的数据库软件导入到SAS中。这里只讲直接输入数据。
直接输入一共就三句话:data、input和cards。
①data语句是给数据集起名字,data和数据集名之间用空格隔开。
data 数据集名;
数据集名只能由英文、数字和下划线组成,而且第一个词不能是数字【即必须以字母A到Z(不区分大小写)或下划线(_)开始】;不能超过32个字符;不能包含空格、中文和特殊字符。
②输入变量用input语句,input语句的基本格式是:
input 变量1 变量2 ......;
各个变量之间用空格隔开,SAS默认是以空格作为分隔符来区分不同变量的,变量的名字与SAS数据集名的规则基本一样。
③输入数据用cards或datalines均可。它的基本格式是:
cards;
数据
;
数据是与变量相对应的,每行的多个数据之间最好用空格隔开。数据可以是数值,也可以是日期或数值以外的字符(包括中文)
举例:
建立一个数据集,起名为first,变量包括我们两个人的性别和年龄,性别男和女分别用1和0表示。
data first;
input gender age;
cards;
1 30
0 24
;
7.数据集的存放
建立在非Work文件夹下的数据集一般称为永久数据集
data sasuser.first;
input gender age;
cards;
1 30
0 24
;
运行后,数据集first就存放到sasuser文件夹下,而不是work文件夹下了,此时first就是个永久数据集。
也可以自己新建一个文件夹,把数据集都放到这个文件夹里,第一,先在自己的电脑中找个位置建立一个文件夹,文件夹的名字随意取,比如我们在G盘新建一文件夹命名为excel。第二,在SAS资源管理器中打开逻辑库。
第二步或者通过
libname 逻辑库文件夹名 硬盘的文件夹路径和名称;
即
libname fgs "g:\excel";
对于自己建立的逻辑库,在调用数据集之前还需要用libname语句把逻辑库与文件夹建立关联。
还有一种非常简单的建立永久数据集的方式,就是直接用data语句指定一个路径和SAS数据集名。此时不需要用libname.
data "g:\excel\first";
input gender age;
cards;
1 30
0 24
;
举例:
libname fgs "g:\excel"; /*调用之前仍需先用libname建立关联*/
proc print data=fgs.first;
run
#或者
proc print data="g:\excel\ first ";
run;
总之,常见的建立永久数据集的方式有三种:一是在逻辑库中用菜单新建文件夹,并与电脑上已有的某个文件夹关联起来;二是用libname语句指定文件夹名,并与电脑上已有的某个文件夹关联起来;三是用data语句直接指定电脑上已存在的文件夹路径及SAS数据集名。
8.建立数据集的高级议题
SAS中的变量有数值型、字符型,日期在SAS中是作为数值型,所有日期型变量被作为输入日期与1960年1月1日之差。如1980-1-1,SAS会默认这个值是7305,而且也会显示为7305。
尤其是日期变量,一定要规定相应的输入格式。输入格式的基本形式是这样的:
input 变量1 输入格式1 变量2 输入格式2 ......;
不同类型变量的输入格式是不同的。
①数值型变量的输入格式主要是w.d,6.3表示总位数是6,包括3位小数;再如4.表示总位数是4,没有小数。一定要注意,即使没有小数,点号也一定要加上。但大多时候对数值型变量是不加输入格式的。
data fh;
input x 4.2; /*变量后的4.2表示变量x的宽度共4位,其中小数有2位*/
cards;
12
2.1
15.6
23.46;
proc print; /*这句话的作用是让读入的数据显示在输出窗口*/
run;
首先,SAS先根据设定的总位数来读取数据,也就是说,每个数只读取前4位,这样4个数分别是12、2.1、15.6和23.4。小数位数规定了2位,所以每个数必须有2位小数点,所以2.1、15.6和23.4分别变成了2.10、15.60和23.40,而SAS读整数就是这样,没有小数点就自动把自己降为小数。如果你在录入的时候是12.0,那就会读成12.00,但12就读成了0.12。此时对数值型指定格式就显得画蛇添足。
②字符型变量的输入格式主要是符号是必须加的,w表示字节数(1个中文占2字节),一般只有在变量宽度超过8字节的时候才有必要加。因为SAS默认对字符只读取8位。
data fh;
input pro $12.;
cards;
山东省青岛市;
proc print;
run;
如果不加“12.”,只加一个美元符号,那么SAS最对多pro读取8字节,也就是4个中文字符,结果就会显示“山东省青”。加上“美元符号12.”才能让SAS完整读取这6个字。字符串变量在结尾有一个$,数字值没有它。
③日期型变量
9.特殊输入符:
冒号的作用是告诉SAS,如果要读取下一个变量,需要满足下面任一条件:要么遇到空格,要么变量的宽度读完了。
data fh;
input city: $18. zone$; /*在city后加了一个冒号*/
cards;
山东省蓬莱市 0536
山东省青岛市市南区 0532
;
proc print;
run;
10.SAS文件扩展名
SAS程序,数据文件和程序的结果在Windows中以各种扩展名保存。
- .sas - 它表示可以使用SAS编辑器或任何文本编辑器编辑的SAS代码文件。
- .log - 它表示SAS日志文件,它包含已提交的SAS程序的错误,警告和数据集详细信息。
- .mht / * .html - 它表示SAS结果文件。
- .sas7bdat - 它表示SAS数据文件,其中包含SAS数据集,包括变量名称,标签和计算结果。
11.注释
单行注释
* This is comment ;
多行注释
* This is first line of the comment
* This is second line of the comment;
或者
单行注释
/* This is comment */
多行注释
/* This is first line of the comment
* This is second line of the comment */
二.介绍部分函数
1.字符串函数
①SUBSTRN
此函数使用开始和结束位置提取子字符串。 如果没有提到结束位置,它提取所有字符直到字符串结束。
SUBSTRN('stringval',p1,p2)
p1为提取的开始位置。
p2为提取的最终位置。
②TRIMN
此函数从字符串中删除尾部空格。
TRIMN('stringval')
③lengthc
计算字符串长度
lengthc("String1")
④其他
data character_functions;
/* Convert the string into lower case */
lowcse_ = LOWCASE('HELLO');
/* Convert the string into upper case */
upcase_ = UPCASE('hello');
/* Reverse the string */
reverse_ = REVERSE('Hello');
/* Return the nth word */
nth_letter_ = SCAN('Learn SAS Now',2);
run;
proc print data = character_functions noobs;
run;
2.数组
①声明数组
ARRAY ARRAY-NAME(SUBSCRIPT) ($) VARIABLE-LIST ARRAY-VALUES
ARRAY是声明数组的SAS关键字。
ARRAY-NAME是遵循与变量名称相同的规则的数组的名称。
SUBSCRIPT是数组要存储的值的数量。
($)是一个可选参数,仅当数组要存储字符值时使用。
VARIABLE-LIST是变量的可选列表,它们是数组值的占位符。
ARRAY-VALUES是存储在数组中的实际值。 它们可以在这里声明,或者可以从文件或dataline中读取。
举例:
# Declare an array of length 5 named AGE with values.
ARRAY AGE[5] (12 18 5 62 44);
②使用OF运算符按行计算
当分析数组形式的数组以对数组的整个行执行计算时,使用OF运算符。 在下面的示例中,我们应用每行中的值的和和均值。
举例:
DATA array_example_OF;
INPUT A1 A2 A3 A4;
ARRAY A(4) A1-A4;
A_SUM=SUM(OF A(*));
A_MEAN=MEAN(OF A(*));
A_MIN=MIN(OF A(*));
DATALINES;
21 4 52 11
96 25 42 6
;
RUN;
PROC PRINT DATA=array_example_OF;
RUN;
结果:
③使用IN运算符检查数组行中是否存在值
也可以使用IN运算符访问数组中的值,该运算符检查数组行中是否存在值。 在下面的例子中,我们检查数据中颜色“黄色”的可用性。 此值区分大小写。
举例:
DATA array_in_example;
INPUT A1 $ A2 $ A3 $ A4 $;
ARRAY COLOURS(4) A1-A4;
IF 'yellow' IN COLOURS THEN available='Yes';ELSE available='No';
DATALINES;
Orange pink violet yellow
;
RUN;
PROC PRINT DATA=array_in_example;
RUN;
结果:
3.运算符
①
加 减 乘 除 幂
Add_result = COL1+COL2;
Sub_result = COL1-COL2;
Mult_result = COL1*COL2;
Div_result = COL1/COL2;
Expo_result = COL1**COL2;
②
且 或 否
and_=(COL1 > 10 & COL2 > 5 );
or_ = (COL1 > 12 | COL2 > 15 );
not_ = ~( COL2 > 7 );
逻辑运算符的结果总是1或0.
③
等于 不等于 大于等于 小于等于 在
EQ_ = (COL1 = 11.21);
NEQ_= (COL1 ^= 11.21);
GT_ = (COL2 => 8);
LT_ = (COL2 <= 12);
IN_ = COL2 in( 6.2,5.3,12 );
④
最小 最大
min_ = MIN(COL1 , COL2 , COL3);
max_ = MAX( COL1, COl2 , COL3);
⑤
连接
concat_ = (COL1 || COL2 || COL3);
例如:'Hello'||'World' 输出 Hello World
4.循环
①DO Index 循环
DO索引循环使用索引变量作为其开始和结束值。 重复执行SAS语句,直到达到索引变量的最终值。
举例:
DATA MYDATA1;
SUM=0;
DO VAR=1 to 5;
SUM=SUM+VAR;
END;
PROC PRINT DATA=MYDATA1;
RUN;
结果:
②DO WHILE 循环
DO WHILE循环使用WHILE条件。 重复执行SAS语句,直到while条件为假。
举例:
DATA MYDATA;
SUM=0;
VAR=1;
DO WHILE(VAR<6) ;
SUM=SUM+VAR;
VAR+1;
END;
PROC PRINT;
RUN;
结果:
③DO UNTIL 循环
DO UNTIL循环使用UNTIL条件。 重复执行SAS语句,直到UNTIL条件变为TRUE。
举例:
DATA MYDATA;
SUM=0;
VAR=1;
DO UNTIL(VAR>5) ;
SUM=SUM+VAR;
VAR+1;
END;
PROC PRINT;
RUN;
结果:
5.决策
IF-THEN-ELSE-IF语句由具有THEN语句的布尔表达式组成。 紧接着是一个ELSE声明。
IF (condition1) THEN result1;
ELSE IF (condition2) THEN result2;
ELSE IF (condition3) THEN result3;
6.截断
/* Nearest greatest integer */
ceil_ = CEIL(11.85);
/* Nearest greatest integer */
floor_ = FLOOR(11.85);
/* Integer portion of a number */
int_ = INT(32.41);
/* Round off to nearest value */
round_ = ROUND(5621.78);
run;
proc print data = trunc_functions noobs;
run;
三.介绍数据集处理过程
1.写入数据集
将使用SASHELP库中提供的名为cars的SAS数据集。
为了写逗号分隔的文件,我们可以使用带有值“csv”的dlm选项。 以下代码写入文件car_data.csv
proc export data=sashelp.cars
outfile=
'/folders/myfolders/sasuser.v94/TutorialsPoint/car_data.csv'
dbms=csv;
run;
2.连接数据集
可以使用SET语句连接多个SAS数据集以提供单个数据集。 在连接的数据集中的观察的总数是原始数据集中的观察的数量的总和。 观察的顺序是连续的。
SET data-set 1 data-set 2 data-set 3.....;
3.合并数据集
可以基于特定的公共变量合并多个SAS数据集以给出单个数据集。 这是使用MERGE语句和BY语句完成的。 合并数据集中的观察的总数通常小于原始数据集中的观察的数量的总和。 这是因为当公共变量的值存在匹配时,变量形成两个数据集合被合并为一个记录。
MERGE Data-Set 1 Data-Set 2
BY Common Variable
4.子集数据集
通过使用KEEP和DROP语句完成变量的子设置,使用DELETE语句完成观察的子设置。
①子设置变量
在这种方法中,我们只从整个数据集中提取很少的变量。
保留需要的
KEEP var1 var2 ... ;
等同于删除不需要的
DROP var1 var2 ... ;
②子设置观察
在这种方法中,我们只从整个数据集中提取少数观测值。
IF Var Condition THEN DELETE ;
5.数据集排序
①正向排序(从低到高)
排序可以发生在任何单个变量以及多个变量。 用于在SAS数据集中执行排序的SAS过程被称为PROC SORT。 排序后的结果存储在新数据集中,原始数据集保持不变。
PROC SORT DATA=original dataset OUT=Sorted dataset;
BY variable name;
变量名是排序发生的列名。
原始数据集是要排序的数据集名称。
排序的数据集是排序后的数据集名称。
②反向排序(从高到低)
通过使用DESCENDING语句实现反向排序。
举例:
PROC SORT DATA=Employee OUT=Sorted_sal_reverse ;
BY DESCENDING salary;
结果:
6.格式数据集
例如,我们想要向有价格信息的变量添加美元符号和两个小数位。 或者我们可能想要显示一个文本变量,全部为大写。 我们可以使用FORMAT来应用内置的SAS格式,PROC FORMAT是应用用户定义的格式。此外,单个格式可以应用于多个变量。
format variable name format name
变量名是在数据集中使用的变量名。
format name是要应用于变量的数据格式。
还可以使用PROC FORMAT来格式化数据
7.在SAS中使用SQL查询
过程PROC SQL用于处理SQL语句。 此过程不仅可以返回SQL查询的结果,还可以创建SAS表和变量。
PROC SQL;
SELECT Columns
FROM TABLE
WHERE Columns
GROUP BY Columns
;
QUIT;
SQL查询写在PROC SQL语句之后,后跟QUIT语句。
在SAS中应用SQL中的CRUD(创建,读取,更新和删除)操作
①SQL创建操作
使用SQL,我们可以创建新的数据集形式原始数据。 在下面的示例中,首先声明一个名为TEMP的数据集,其中包含原始数据。 然后我们写一个SQL查询,从这个数据集的变量创建一个表。
DATA TEMP;
INPUT ID $ NAME $ SALARY DEPARTMENT $;
DATALINES;
1 Rick 623.3 IT
2 Dan 515.2 Operations
3 Michelle 611 IT
4 Ryan 729 HR
5 Gary 843.25 Finance
6 Nina 578 IT
7 Simon 632.8 Operations
8 Guru 722.5 Finance
;
RUN;
PROC SQL;
CREATE TABLE EMPLOYEES AS
SELECT * FROM TEMP;
QUIT;
PROC PRINT data = EMPLOYEES;
RUN;
②SQL读操作
SQL中的读取操作涉及编写SQL SELECT查询以从表中读取数据。 In以下程序查询库SASHELP中可用的名为CARS的SAS数据集。 查询获取数据集的某些列。
PROC SQL;
SELECT make,model,type,invoice,horsepower
FROM
SASHELP.CARS
;
QUIT;
③SQL SELECT with WHERE Clause 条件查询语句
以下程序使用where子句查询CARS数据集。 在结果中,我们只得到了作为“Audi”和类型为“Sports”的观察。
PROC SQL;
SELECT make,model,type,invoice,horsepower
FROM
SASHELP.CARS
Where make = 'Audi'
and Type = 'Sports'
;
QUIT;
④SQL UPDATE操作
我们可以使用SQL Update语句更新SAS表。 下面我们首先创建一个名为EMPLOYEES2的新表,然后使用SQL UPDATE语句更新它。
DATA TEMP;
INPUT ID $ NAME $ SALARY DEPARTMENT $;
DATALINES;
1 Rick 623.3 IT
2 Dan 515.2 Operations
3 Michelle 611 IT
4 Ryan 729 HR
5 Gary 843.25 Finance
6 Nina 578 IT
7 Simon 632.8 Operations
8 Guru 722.5 Finance
;
RUN;
PROC SQL;
CREATE TABLE EMPLOYEES2 AS
SELECT ID as EMPID,
Name as EMPNAME ,
SALARY as SALARY,
DEPARTMENT as DEPT,
SALARY*0.23 as COMMISION
FROM TEMP;
QUIT;
PROC SQL;
UPDATE EMPLOYEES2
SET SALARY=SALARY*1.25;
QUIT;
PROC PRINT data = EMPLOYEES2;
RUN;
⑤在SQL中删除操作
SQL中的删除操作涉及使用SQL DELETE语句从表中删除某些值。 我们继续使用上面示例中的数据,并从表中删除雇员的工资大于900的行。
PROC SQL;
DELETE FROM EMPLOYEES2
WHERE SALARY > 900;
QUIT;
PROC PRINT data = EMPLOYEES2;
RUN;
四.数据展示
1.直方图
在SAS中创建直方图的基本语法是:
PROC UNIVARAITE DATA = DATASET;
HISTOGRAM variables;
RUN;
DATASET是所使用的数据集的名称。
变量是用于绘制直方图的值。
①简单直方图
proc univariate data=sashelp.cars;
histogram horsepower
/ midpoints = 176 to 350 by 50;
run;
②带曲线拟合的直方图
proc univariate data=sashelp.cars noprint;
histogram horsepower
/
normal (
mu = est #平均值和标准偏差值被称为EST
sigma = est
color = blue
w = 2.5
)
barlabel=percent
midpoints = 70 to 550 by 50;
run;
2.条形图
在SAS中创建条形图的基本语法是:
PROC SGPLOT DATA = DATASET;
VBAR variables;
RUN;
DATASET是所使用的数据集的名称。
变量是用于绘制直方图的值。
矩形条中的数据,条的长度与变量的值成比例
①简单的条形图
表示汽车的长度为条形
PROC SQL;
create table CARS1 as
SELECT make,model,type,invoice,horsepower,length,weight
FROM
SASHELP.CARS
WHERE make in ('Audi','BMW')
;
RUN;
proc SGPLOT data=work.cars1;
vbar length ;
title 'Lengths of cars';
run;
quit;
②堆叠条形图
是一个条形图,其中相对于另一个变量计算数据集中的变量
计算每种车型的车辆长度
proc SGPLOT data=work.cars1;
vbar length /group = type ;
title 'Lengths of Cars by Types';
run;
quit;
③复式条形图
创建一个集群的条形图,其中汽车的长度是围绕汽车类型聚类。所以我们看到在长度191两个相邻的条形图,一为车型'轿车',而另一个用于汽车类型“旅行车”。
proc SGPLOT data=work.cars1;
vbar length /group = type GROUPDISPLAY = CLUSTER;
title 'Cluster of Cars by Types';
run;
quit;
3.饼图
饼图使用PROC TEMPLATE创建,它采用参数来控制百分比,标签,颜色,标题等。
每个切片代表汽车类型与汽车总数的比例。
PROC SQL;
create table CARS1 as
SELECT make,model,type,invoice,horsepower,length,weight
FROM
SASHELP.CARS
WHERE make in ('Audi','BMW')
;
RUN;
PROC TEMPLATE;
DEFINE STATGRAPH pie;
BEGINGRAPH;
LAYOUT REGION;
PIECHART CATEGORY = type /
DATALABELLOCATION = OUTSIDE
CATEGORYDIRECTION = CLOCKWISE
START = 180 NAME = 'pie';
DISCRETELEGEND 'pie' /
TITLE = 'Car Types';
ENDLAYOUT;
ENDGRAPH;
END;
RUN;
PROC SGRENDER DATA = cars1
TEMPLATE = pie;
RUN;
4.散点图
在SAS中创建散点图的基本语法是:
PROC sgscatter DATA=DATASET;
PLOT VARIABLE_1 * VARIABLE_2
/ datalabel = VARIABLE group = VARIABLE;
RUN;
5.箱线图
基本的语法来创建一个箱线图在SAS是:
PROC SGPLOT DATA=DATASET;
VBOX VARIABLE / category = VARIABLE;
RUN;
PROC SGPANEL DATA=DATASET;;
PANELBY VARIABLE;
VBOX VARIABLE> / category = VARIABLE;
RUN;
五.统计函数
1.线性回归
程序PROC REG用于找到两个变量之间的线性回归模型。
PROC REG DATA = dataset;
MODEL variable_1 = variable_2;
Dataset是数据集的名称。
variable_1和variable_2是用于查找相关性的数据集的变量名称。
2.卡方
卡方检验用于检验两个分类变量之间的关联。 它可以用于测试变量的依赖程度和独立性程度。 SAS使用PROC FREQ和chisq选项来确定卡方检验的结果。
PROC FREQ DATA = dataset;
TABLES variables
/CHISQ TESTP=(percentage values);
Dataset是数据集的名称。
变量是在卡方检验中使用的数据集的变量名。
百分比TESTP语句中的值表示变量的级别的百分比。
双向卡方
当我们将测试应用于数据集的两个变量时,使用双向卡方检验。
proc freq data = sashelp.cars;
tables type*origin
/chisq
;
run;
3.单因素方差分析
ANOVA代表方差分析。 在SAS中,它使用PROC ANOVA完成。
PROC ANOVA dataset ;
CLASS Variable;
MODEL Variable1=variable2 ;
MEANS ;
dataset是数据集的名称。
CLASS给出变量用作分类变量的变量。
MODEL使用数据集中的某些变量定义要拟合的模型。
Variable_1和Variable_2是分析中使用的数据集的变量名称。
MEANS定义计算的类型和均值的比较。
4.t test
进行T检验以通过比较它们的均值和平均差异来计算一个样本或两个独立样本的置信限度。 名为PROC TTEST的SAS过程用于对单个变量和一对变量执行t个测试。
PROC TTEST DATA = dataset;
VAR variable;
CLASS Variable;
PAIRED Variable_1 * Variable_2; #配对t检验,进行配对T检验以测试两个因变量是否在统计学上彼此不同。
Dataset是数据集的名称。
Variable_1和Variable_2是在t test中使用的数据集的变量名。
5.交叉表格
交叉制表涉及使用两个或更多变量的所有可能组合来产生也称为偶然表的交叉表。 在SAS中,它使用PROC FREQ以及TABLES选项创建。
PROC FREQ DATA = dataset;
TABLES variable_1*Variable_2;
Dataset是数据集的名称。
Variable_1和Variable_2是需要计算其频率分布的数据集的变量名称。
6.相关性分析
相关性分析处理变量之间的关系。 相关系数是两个变量之间的线性关联的度量。相关系数的值总是在-1和+1之间。 SAS提供过程PROC CORR以找到数据集中的一对变量之间的相关系数。
PROC CORR DATA = dataset options;
VAR variable;
Dataset是数据集的名称。
选项是附加选项,其中包括绘制矩阵等过程。
变量是用于查找相关性的数据集的变量名称。