Using SAS Config named: winlocal
SAS Connection established. Subprocess id is 30068
05-SAS 数据库与数据集
SAS 数据库与数据集的基本知识
1 数据库
1.1 数据库与库标记
SAS 数据库是一个包含数据集的文件夹。每个数据库都包含一个或多个数据集。SAS 数据库的扩展名为 .sas7bdat
。SAS 数据库可以存储在本地计算机上,也可以存储在远程服务器上。
SAS 数据库可以通过 SAS 程序或 SAS 界面创建和管理。SAS 数据库可以包含多种类型的数据集,包括 SAS 数据集、Excel 数据集、CSV 数据集等。SAS 数据库可以通过 SAS 程序或 SAS 界面进行访问和管理。
数据库使得 SAS 系统能够在 SAS 程序中调用指定的文件。
为了使用 SAS 数据库,需要为每个数据库制定一个库标记来识别。库标记又称库逻辑名或库关联名。库标记是一个 SAS 程序中的变量名,用于引用数据库中的数据集。库标记可以是任意合法的 SAS 变量名,但通常使用大写字母和下划线来命名。例如,WORK
、SASUSER
、MYDATA
等都是合法的库标记。
1.2 数据库类型
SAS 数据库有两种类型:永久数据库和临时数据库。
- 永久数据库:永久数据库是指在 SAS 程序运行结束后仍然存在的数据库。永久数据库通常存储在本地计算机或远程服务器上。永久数据库可以通过 SAS 程序或 SAS 界面进行访问和管理;在安装 SAS 时,SAS 会自动创建一个永久数据库,名为
SASUSER
,用于存储用户的个人数据集。永久数据库的库标记通常以大写字母和下划线命名,例如MYDATA
。 - 临时数据库:临时数据库是指在 SAS 程序运行结束后自动删除的数据库。临时数据库通常存储在内存中。临时数据库只能通过 SAS 程序进行访问和管理,不能通过 SAS 界面进行访问和管理;临时数据库一般存储在
WORK
目录中,WORK
目录是一个临时数据库,用于存储临时数据集。临时数据库的库标记通常以小写字母和下划线命名,例如work
、temp
等。
永久型数据库的库标记也可以由用户使用 libname
语句来自行定义,libname
语句的一般形式为:
其中,libref
是库标记,path
是数据库的路径。libname
语句可以在 SAS 程序的任何位置使用,但通常在程序的开头使用。libname
语句可以用于创建永久数据库,也可以用于访问已有的永久数据库。
启动 SAS 后,除了 Sasuser
数据库外,还会自动生成另外两个永久型数据库,他们的库标记分别为 Sashelp
和 Maps
。
另外,根据用户安装的模块,在启动 SAS 后,会自动生成一些特殊的永久型数据库。
2 数据集
2.1 数据集的类型
SAS 数据集有两种类型: SAS 数据文件(SAS data files)和 SAS 数据视窗(SAS data views)。
SAS 的数据文件不仅包括描述部分,也包括数据部分。SAS 的视窗文件只有描述部分,没有数据部分,它的描述部分包括的信息使 SAS 过程可以访问到实际上并不包含在数据视窗内部的数据。
一般情况下所说的 SAS 数据集指的是 SAS 数据文件。
2.2 变量类型
数据集中的变量可以有两种类型:数值型和字符型。
数值型变量只允许变量值为数字,SAS 过程可以对这些数字进行统计运算,如计算变量的均数、标准差等。一般情况下, SAS 默认数值型变量小数点后保留两位有效数值,而小数点前的位数就是该变量值所有数值中的最大位数。
用户也可以用 length
语句或 attrib
语句自己定义变量长度。 数值型变量当数据缺失时, SAS 表示为 .
。
字符型变量允许变量值为中、英文字母、各种符号和数字,此时的数字被当作字符处理,无法进行统计运算。字符型变量的默认长度为8个字 节,然而 SAS 规定字符型变量的最大长度不能超过 200 个字节。字符型变量数据缺失时, SAS 表示为空格。
2.3 数据集的命令
每个 SAS 数据集都有一个两级文件名,第一级是库标记,第二级是文件名,两者之间用 .
分隔。在建立 SAS 数据集时,可以通过指定两级文 件名定义 SAS 数据集,便于以后用 SAS 过程来识别和处理。
如例 data prg1-1
,表示该数据集为临时数据集,临时数据集的第一级库标记应为 Work
,也可以省略该库标记。 如果将该数据集存放在硬盘的另一个目录中如 Sasuser
,则数据集名为 sasuser.prg1-1
,其物理位置就是 Sasuser
这个库标记所指定的文件夹,该数据集将永久保留在硬盘上。
3 数据集的建立
3.1 创建 SAS 数据集
建立数据集一般在数据步中完成,可以通过直接录人数据或者导人其他格式的数据文件中的数据,来建立 SAS 可以识别的 SAS 数据集。主要有如下几种方法:
input
和datalines
语句
%%SAS
/*程序2-1*/
/*10例肾移植患者的部分数据*/
/*M为男性,F为女性*/
data prg2_1;
input no sex $ age blood $ surt;
datalines;
1 M 41 A 368
2 M 26 B 745
3 F 35 B 401
4 M 37 AB 552
5 F 37 A 478
6 F 39 O 628
7 M 28 O 549
8 M 31 B 128
9 M 43 AB 463
10 M 29 A 512
;
run;
Using SAS Config named: winlocal
SAS Connection established. Subprocess id is 25624
5 SAS 系统 19:02 Monday, May 26, 2025
24 ods listing close;ods html5 (id=saspy_internal) file=_tomods1 options(bitmap_mode='inline') device=svg style=HTMLBlue;
24 ! ods graphics on / outputfmt=png;
NOTE: 正在写入 HTML5(SASPY_INTERNAL) Body(主体)文件: _TOMODS1
25
26 /*程序2-1*/
27 /*10例肾移植患者的部分数据*/
28 /*M为男性,F为女性*/
29 data prg2_1;
30 input no sex $ age blood $ surt;
31 datalines;
NOTE: 数据集 WORK.PRG2_1 有 10 个观测和 5 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.00 秒
CPU 时间 0.01 秒
42 ;
43 run;
44
45
46
47 ods html5 (id=saspy_internal) close;ods listing;
48
6 SAS 系统 19:02 Monday, May 26, 2025
49
程序 2-1 中第一行 data prg2_1;
是要求建立一个文件名为 prg2_1
的数据集,该数据集是一个临时数据集,系统会自动将其存放在 Work
目录中。第二行 input
语句定义了数据集的变量名和变量类型,其中 @
符号表示在同一行中输入数据,而 datalines
语句则表示数据的输入结束。最后一行 run;
表示程序结束。
第一行会建立一个名为 prg2_1
的数据集,该数据集是一个临时数据集,系统会自动将其存放在 Work
数据库目录中。文件的后缀名为 sas7bdat
,所以从 Windows资源管理器中查看该文件,文件名为 prg2_1.sas7bdat
。如果需建立永久型数据集,可在 prg2_1
前面加上库标记,如 sasuser.prg2_1
,则该 数据集将保存 Sasuser 数据库中,退出 SAS 也不会将该数据集删除。
第二行 input no sex $ age blood $ surt;
是要求在 prg2_1.sas7bdat
数据集中建立5个变量, 它们的变量名分别为 no
、sex
、age
、blood
和 surt
,其中sex
和blood
变量名后面加上了一个符号 $
,表示这些变量为字符型变量,其他未加 $
的变量则默认为数值型变量。
第三行 datalines;
表明开始对变量进行赋值,它向 SAS 指示下一行开始是数据行,直到分号出现,数据行赋值结束。而该分号必须出现在所有数据的下一行,才表示结束数据行。数据行中不同变量的数据之间可用一个或多个空格 分开。
最后一行 run;
表示 data
步的结束,当后面还有其他数据步或过程步语句,该语句可省略。
打印数据集
观测 | no | sex | age | blood | surt |
---|---|---|---|---|---|
1 | 1 | M | 41 | A | 368 |
2 | 2 | M | 26 | B | 745 |
3 | 3 | F | 35 | B | 401 |
4 | 4 | M | 37 | AB | 552 |
5 | 5 | F | 37 | A | 478 |
6 | 6 | F | 39 | 0 | 628 |
7 | 7 | M | 28 | 0 | 549 |
8 | 8 | M | 31 | B | 128 |
9 | 9 | M | 43 | AB | 463 |
10 | 10 | M | 29 | A | 512 |
横向输入
如果数据集中变量较少,而观测值较多,可以使用横向输入的方法来输入数据,具体方法是在 input
语句中的变量名加上两个 @@
符号,表示在同一行中输入数据,则在数据行中的数据可以横行排列,每个数据之间用空格分隔。
具体如下程序 2-3 所示:
3.2 if-then/else语句
如果需要从已知的数据集中将部分观测的资料取出来,重新建立一个新数据集,可用 if-then
语句,如将上述程序 2-1 资料中所有男性的资料建立一个新数据集,可用如下程序:
%%SAS
/*程序2-4*/
/*if-then/else语句*/
/*从已知的数据集中将部分观测的资料取出来,重新建立一个数据集*/
/*output表示将满足条件的观测值保存到新建的数据集中
delete则表示将数据集prg2_1所有的观测值保存到新的观测值中,并删除满足条件的观测值*/
data male;
set prg2_1;
if sex = 'M' then output;
/*if sex = 'F' then delete;*/
/*run;*/
proc print data = male;
run;
观测 | no | sex | age | blood | surt |
---|---|---|---|---|---|
1 | 1 | M | 41 | A | 368 |
2 | 2 | M | 26 | B | 745 |
3 | 4 | M | 37 | AB | 552 |
4 | 7 | M | 28 | 0 | 549 |
5 | 8 | M | 31 | B | 128 |
6 | 9 | M | 43 | AB | 463 |
7 | 10 | M | 29 | A | 512 |
程序 2-4 中第一行的 data male;
表示将建立一个新的数据集,其文件名为 male.sas7bdat
。
第二行 set prg2_1;
表示将从数据集 prg2_1
中读取数据。
第三行 if sex='M' then output;
表示当变量 sex
的值是 M
时,该观测将被保存在 male
数据集中,如果不满足该条件,则不会保存在 male
数 据集中。有时, then output
可以省略,或者该语句也可以用下面的语句表示:
output 与 delete 的区别
output
表示将满足条件的观测保存到新建的数据集中,而 delete
则表示将数据集 prg2_1
所有观测保存到新的数据集中,并删除满足条件的 观测。
3.3 else 语句
如果希望将满足条件的观测保存到一个新的数据集中,将不满足条件的观测保存到另一个新的数据集中,可用 else
语句。现在需将男性的资料保存在 male
数据集中,将女性的资料保存在 female
数据集中,可用如下程序:
%%SAS
/*程序2-5*/
/*将满足的数据保存在一个数据集中,不满足的保存到另一个*/
data male female;
set prg2_1;
if sex = 'M' then output male;
else output female;
run;
proc print data=male;
title 'Male Data';
run;
proc print data=female;
title 'Female Data';
run;
观测 | no | sex | age | blood | surt |
---|---|---|---|---|---|
1 | 1 | M | 41 | A | 368 |
2 | 2 | M | 26 | B | 745 |
3 | 4 | M | 37 | AB | 552 |
4 | 7 | M | 28 | 0 | 549 |
5 | 8 | M | 31 | B | 128 |
6 | 9 | M | 43 | AB | 463 |
7 | 10 | M | 29 | A | 512 |
观测 | no | sex | age | blood | surt |
---|---|---|---|---|---|
1 | 3 | F | 35 | B | 401 |
2 | 5 | F | 37 | A | 478 |
3 | 6 | F | 39 | 0 | 628 |
3.4 drop/keep 语句
这两个语句允许用户根据原有数据集的内容,保留部分变量在新数据集中。
drop
语句规定在新数据集中将不保留哪些变量, keep
语句规定在新数据集中保留哪些变量。
程序 2-6 和程序 2-7 都表示新数据集 new
中将分别保留原数据集 prg2_1
中的 no、sex 和 surt 三个变量和保留 age 和 blood 这两个变量,分别使用 drop
和 keep
语句。
%%SAS
/*drop/keep语句,drop规定新数据集中不保留那些变量
keep语句规定那些变量被保留*/
data new;
set prg2_1;
drop age blood;
proc print data = new;
run;
/*keep*/
data new;
set prg2_1;
keep age blood;
proc print data = new;
run;
观测 | no | sex | surt |
---|---|---|---|
1 | 1 | M | 368 |
2 | 2 | M | 745 |
3 | 3 | F | 401 |
4 | 4 | M | 552 |
5 | 5 | F | 478 |
6 | 6 | F | 628 |
7 | 7 | M | 549 |
8 | 8 | M | 128 |
9 | 9 | M | 463 |
10 | 10 | M | 512 |
观测 | age | blood |
---|---|---|
1 | 41 | A |
2 | 26 | B |
3 | 35 | B |
4 | 37 | AB |
5 | 37 | A |
6 | 39 | 0 |
7 | 28 | 0 |
8 | 31 | B |
9 | 43 | AB |
10 | 29 | A |
4 其他格式文件转换为 SAS 数据集
4.1 文本文件转换为 SAS 数据集
文本文件是指以纯文本格式存储的数据文件,通常以 .txt
或 .csv
为扩展名。SAS 可以通过 infile
语句和 input
语句将文本文件转换为 SAS 数据集。
形如如下程序:
/*程序2-7*/
/*文本文件转换为SAS数据集*/
/*路径必须用单引号括起来,而且文件后缀名不能省略*/
data prg2_3;
infile 'C:\Document\SASData\syz.txt';
input no sex $ age blood $ surt;
run;
注意:文件中不能有变量名,至于具体哪个数值属于哪个变量用户必须自己清楚。
infile
语句必须在 data
语句的后面,在 input
语句的前面。
由于纯文本文件中没有变量名称,所以第三行的语句 input no sex $ age blood $ surt;
就是定义数据集中的变量名,而且变量名的次序 必须和纯文本文件中所对应的数据值的次序相同。
4.2 Excel 文件转换为 SAS 数据集
- 使用 Import Menu 选项
- 使用
proc import
过程
选项 2 使用 proc import
过程可以将 Excel 文件转换为 SAS 数据集。proc import
过程的基本语法如下:
/*程序2-8*/
/*sheet = "sheet1$";是读取工作表 1 中的数据导入SAS数据集*/
proc import
datafile = "C:\Document\SASData\syz.xlsx"
out = work.prg2_5
dbms = excel replace;
sheet = "sheet1$";
run;
proc
是过程步开始的关键词, import
是过程步中的过程名称,该过程中 datafile = "C:\Document\SASData\syz.xlsx"
表示将 C:\Document\SASData\syz.xlsx
文件中的数据转换为 SAS 数据集格式的数据, out = work.prg2_5
表示建立一个名称为 prg2_5.sas7bdat
的临时数据集, dbms = excel
表示原文件格式为 Excel 文件格式; replace
表示如果该数据集文件已经存在,则该文件中原来的数据将被新的数据替代。
以上四个选项都是 import
语句的选项,彼此之间用空格分隔不能用 ;
隔开。