1.3 SAS数据集整理
本章1.2节简单介绍了SAS的界面,并引入SAS逻辑库和数据集,详述了新建逻辑库的方法,以及数据集文件的复制、删除等操作。以下介绍SAS数据集的一般操作。
1.3.1 新建数据集
在SAS系统中可以使用编程和Viewtable表的方式新建SAS数据集,并对数据集进行修改、增删记录等操作。以下通过例1-1介绍这两种方法的具体使用。
例1-1 请根据表1-1所示信息新建数据集chap1.example1_1。
表1-1 某公司客户信息表
方法一:编写如下程序(其在光盘中的存储路径为“proc\chap1\example1_1.sas”)。
libname chap1'E:\data\chap1'; /*新建指向路径为“E:\data\chap1”的逻辑库chap1*/ data chap1.example1_1; /*新建永久SAS数据集chap1.example1*/ input ID$1-4 name$5-11 Type$13-19 birth YYMMDD8.+1 N; /*定义变量输入格式*/ cards; 0101 张三 金卡 64/10/06 20 0102 李四 银卡 82/09/16 13 0103 王五 普通卡 87/01/27 5 ; /*输入数据*/ proc print; format birth YYMMDD8.; /*设置变量birth的输出格式*/ run;
选择Run|Submit命令提交程序,在Output输出记录窗口显示如图1-5所示,且在新建的逻辑库chap1中出现了数据集example1。
图1-5 结果输出
注意:日期格式的变量在SAS中默认保存为从1960年1月1日至某日期的天数,如1964年10月6号,默认输出为1740。在打印输出日期格式的变量时,为了得到特定格式,务必使用format语句指定输出格式。而SAS数据集chap1.example1,变量birth也将显示天数,此时右键单击变量名,在快捷菜单中选择 Column Attribute(变量属性),单击弹出的对话框中的 format后的按钮,在此可以选择设置变量的输出格式。
方法二:Viewtable表新建数据集。
步骤一:打开新表
选择菜单Tools|Table Editor打开一个新表,如图1-6所示。
图1-6 Viewtable表视窗
步骤二:定义变量
右键单击A列,选择Column Attributes(变量属性)命令,弹出如图1-7所示对话框,在Name栏中输入变量名ID,Type(类型)为默认Character(字符型),Length(长度)为8,Format (输出格式)和Informat(输入格式)为$8.(默认设置)。左键单击Apply(应用)按钮,再单击Close(关闭)按钮;或者直接单击Close按钮完成第一列姓名变量的属性设置。
图1-7 设置变量属性
重复以上操作,定义变量Name、Type时变量类型(Type)选择Character,输出格式(Format)和输入格式(Informat)选择默认值$8.;定义变量birth时变量类型(Type)选择Numeric,Format (输出格式)和Informat(输入格式)选择yy/mm/dd;定义变量 N时变量类型(Type)选择Numeric, Format(输出格式)和Informat(输入格式)选择默认值$8.。
说明:用户根据变量性质选择设置变量类型(Type)为字符型(Character)和数值型(Numeric)。Informat和Format分别代表数据的输入格式和输出格式,可单击格式右侧的“…”按钮设置。在窗口的Label栏中可以输入变量标签。若不定义变量标签,则系统默认变量名为标签名。打开数据集时,Viewtable 表头为标签名,可通过主菜单 View|Columns Labels 和View|Columns Names进行切换。
步骤三:输入数据、保存数据集
直接在表中输入相应数据,然后直接单击工具栏上的保存图标,或者选择菜单File|Save,在弹出的对话框中左键单击选择需要存入的库名chap1,在Member Name(对象名称)框中输入数据集名example1,单击Save(保存)按钮保存设置。
若要修改已有数据集的变量标签,可选择菜单Editor|Edit Mode(编辑模式)更改系统默认的Browse(浏览)模式。
若要更改已存在的数据集变量名,可使用RENAME语句用编程的方式实现,它的一般使用格式如下:
RENAME OLD1=NEW1 OLD2=NEW2 OLD3=NEW3;
注意:建议读者在观测和变量不多,数据形式不复杂的情形下选用编程的方式新建数据集,否则可选择便捷的Viewtable 表建立SAS 数据集。若是海量数据,则采用从外部数据库将数据导入SAS系统进行计算的方式。
1.3.2 在数据集中增加、筛选变量和观测
在DATA步中可以直接利用新建变量语句来产生新变量,筛选变量可使用KEEP/DROP语句, KEEP 语句用来指定需要保留的变量;DROP 语句用来指定被删除的变量。注意在一个程序里,不能同时使用DROP/KEEP语句。KEEP/DROP语句的语句格式如下(注意:变量间用空格分开):
● KEEP语句格式1:KEEP 变量1 变量2…变量N;
● KEEP语句格式2:DATA=数据集名称(KEEP=变量1 变量2…变量N);
● DROP语句格式1:DROP变量1 变量2…变量N;
● DROP语句格式2:DATA=数据集名称(DROP=变量1 变量2…变量N);
在SAS数据集中可使用IF-THEN语句实现筛选观测。该语句有以下两种使用格式:
格式一:IF 条件表达式 THEN;
格式二:IF 条件表达式 THEN SAS语句;
<ELSE SAS语句 >;
当我们在创建SAS数据集时使用IF语句的格式之一,可以根据被处理的观测是否使IF条件表达式为真,来决定是否执行THEN后面的SAS语句。如果条件表达式为假,执行ELSE后面的语句,没有ELSE语句则执行IF语句的下一条语句。且IF THEN/ELSE语句还可多层嵌套,不过请注意此种语句的程序编写格式和匹配。
以下通过一个综合例子来说明以上语句的具体使用。
例1-2 根据表1-2抽查的某班8个学生的体检结果新建数据集chap1.example1_2,并实现如下操作:
(1)根据身高和体重计算每位学生的体重指数(BMI),已知体重指数等于体重(单位为kg)除以身高(单位为m)的平方。
(2)仅保留学生姓名、BMI和性别。
(3)仅保留体重指数处在正常范围的学生信息(18<BMI<25)。
表1-2 某班学生体检抽查结果
注:体重的单位为kg,身高的单位为m。
编写如下程序(其在光盘中保存路径为“proc\chap1\example1_2”):
data chap1.example1_2; input ID$1-2 name$3-10 sex$11-12 +1 weight+1 height; cards; 01 姚籽萱 女 50.5 1.63 02 徐若黛 女 51 1.53 03 张林 男 60 1.72 04 谢欣然 女 62 1.70 05 夏天 女 54 1.67 06 刘子然 男 70 1.80 07 赵赵 男 65 1.75 08 章峰 男 84 1.68 ; run; /*以上程序新建了包含了表格的数据集chap2.example1_2*/ /*解答问题A*/ data chap1.example1_2; set chap1.example1_2; BMI=weight/(height**2); /*根据公式计算BMI*/ run; /*解答问题B*/ data chap1.example1_2; set chap1.example1_2; keep ID sex BMI; /*此行也可改写为drop name weight height;*/ run; /*解答问题C*/ data chap1.example1_2; set chap1.example1_2; if BMI>18&&BMI<25; /*保留BMI在18~25的观测*/ run;
1.3.3 对数据集排序
数据集的排序可应用SORT过程编程实现,该过程的语法结构如下:
PROC SORT <选项>; BY<DESCENDING> 变量名; RUN;
注意:DESCENDING选项只对随后的一个变量起作用。如果省略DESCENDING指令,系统将默认指定升序排列。
例1-3 将数据集chap1.example1_2对学生按其BMI的值降序排列,并另存为数据集chap1. example1_3。
编写如下程序(其在光盘中的存储路径为“proc\chap1\example1_3”):
proc sort data=chap1.example1_2 out=chap1.example1_3; /*对数据集chap1.example1_2排序,将结果另存为chap1.example1_3*/ by descending BMI; /*按照BMI的值降序排列,若需要升序排列则将descending改写成ascending*/ run; proc print data=chap1.example1_3; run;
选择Run|Submit命令提交程序,打印输出结果如下:
图1-8 排序后输出结果
1.3.4 数据集纵向连接
数据的纵向连接指几个数据集中的数据纵向相加连接为一个新的数据集,它的记录数将是原来几个数据集中记录数的总和。此操作在DATA步中用SET指令实现。
Set命令的语法格式如下:
set 数据集名称1 数据集名称2…数据集名称n;
例1-4 若已存在数据集chap1.A、chap1.B和chap1.C(内容如表1-3、表1-4和表1-5所示,存储在光盘中的路径分别为“data\chap1\A”、“data\chap1\B”、“data\chap1\C”)。
表1-3 数据集A
表1-4 数据集B
表1-5 数据集C
(1)将数据集chap1.A和chap1.B纵向连接成数据集chap1.AB。
(2)将数据集chap1.A和chap1.C纵向连接成数据集chap1.AC。
编写如下程序(其在光盘中的存储路径为“proc\chap1\set”):
data chap1.AB; set chap1.A chap1.B; /*合并数据集chap1.A和chap1.B*/ run; data chap1.AC; set chap1.A chap1.C; /*合并数据集chap1.A和chap1.C*/ run;
选择Run|Submit命令提交程序,则新建数据集chap1.AB和chap1.AC如表1-6和表1-7所示。
表1-6 数据集chap1.AB
表1-7 数据集chap1.AC
观察可知,数据集中的同名变量会自动合并(表1-6所示),对于其中不同名的变量,SAS会在缺少相应数值的位置显示缺失(如表1-7所示)。
1.3.5 数据集横向合并
数据集的横向合并是指通过使用 MERGE 语句把两个及两个以上数据集中的两条或两条以上的观测合并为新数据集中的一条观测。它主要分为一对一合并和匹配合并。
一对一合并指把一个数据集中的第k条观测同另一个数据集中的第k条观测合并。新生成的数据集中的观测总数为这些数据集中观测个数的最大值。如果相应的某个数据集已没有观测,则相应的变量值为默认值。若在几个数据集中有共同的变量,则SAS默认使用最后出现的数据集中的变量值。
匹配合并与一对一合并最主要的区别在于它按照相同的关键变量合并。合并前必须把每个数据集根据关键变量排序。
例1-5 若已存在数据集chap1.C和数据集chap1.D(内容如表1-5和表1-8所示),将它们按照关键变量name横向连接成数据集chap1.CD。
表1-8 数据集chap1.D
编写如下程序(其存储在光盘中的路径为“proc\chap1\merge”):
proc sort data=chap1.C out=chap1.C; by name; run; proc sort data=chap1.D out=chap1.D; by name; run; /*以上对数据集chap1.C和chap1.D按照关键变量name升序排列*/ data chap1.CD; merge chap1.C chap1.D; /*横向合并数据集chap1.C和chap1.D*/ by name; /*设置关键变量为id*/ run;
选择Run|Submit命令提交程序,则新建数据集chap1.CD如表1-9所示。
表1-9 数据集chap1.CD
1.3.6 数据集转置
数据集的转置即把SAS数据集的行列互换。可应用SAS的TRANSPOSE过程完成此功能,该过程一般使用如下格式:
PROC TRANSPOSE<<DATA=输入数据集 OUT=转置数据集><选项列表>; VAR 变量列表; ID 变量; COPY 变量列表; RUN;
TRANSPOSE过程从读取的数据集中创建主要包含以下三类变量的新数据集:
● 由原数据集中的观测转置后创建的新变量,即转置变量,如_NEME_、COL1、COL2、COL3…COLn。
说明:用户可自设转置变量名的方法有:
(1)通过PROC TRANSPOSE语句的选项OLDNAME=NEWNAME将原数据集中的变量名改为新变量NEWNAME。
(2)通过选项prefix=NO,修改默认的新变量名COL1、COL2、COL3为NO1、NO2、NO3。
(3)用 ID 命令定义原数据集中某一变量的对应取值来代替新变量名称 COL1、COL2、COL3。
● 从原数据集中复制过来的变量,使用COPY语句定义这个变量,COPY的变量与原数据集中的变量有相同的变量名和值。
● 为识别新数据集中每条观测的来源,用ID语句定义的新变量。
例1-6 已知数据集chap1.A(内容如表1-3所示,其存储在光盘中的路径为“data\chap1\A”),将其转置为新数据集chap1.TA,并且将原数据集中的变量name变为course、列变量改为学生姓名。
编写如下程序(其存储在光盘中的路径为“proc\chap1\example1_6”):
proc transpose data=chap1.A out=chap1.TA name=course; /*将数据集chap1.A转置为新数据集chap1.TA,变量名name改为course*/ var statistics chinese; /*指定转置变量*/ id name; run;
选择Run|Submit命令提交程序,新建转置后的数据集chap1.TA如表1-10所示。
表1-10 数据集chap1.TA
1.3.7 数据集的导入与导出
SAS系统的Import Wizard和Export Wizard提供了便捷的菜单操作方式实现数据集的导入与导出。以下通过例1-7详述使用方法。
例1-7 已知SPSS数据文件height.sav(其在光盘中的存储路径为chap1/data/height.sav)。
(1)将其导入SAS系统,存储成数据集chap1.example1_7。
(2)将数据集chap1.example1_7导出成Excel表格height.xls。
问题(1)的操作过程如下。
步骤一:选择菜单File|Import,弹出如图1-9所示对话框,Standard data source(标准数据)选项下的Select a data source from the list列出了能通过Import Wizard过程导入SAS系统的标准数据格式,本例中选择SPSS File(*.sav),单击Next按钮进入如图1-10所示界面。
图1-9 导入数据——选择数据类型
图1-10 导入数据——指定数据文件
步骤二:在Where is the file(文件路径)栏中输入需要导入文件在PC上的存储路径,或者单击Browse(浏览)按钮在弹出的对话框中选择指定文件,单击Next按钮,进入图1-11所示界面。
步骤三:在Choose the SAS destination(定义存储的SAS数据集)下的Library(逻辑库)下拉列表中指定存储的逻辑库名 CHAP1,在 Member(对象)下拉列表中指定存储的数据集EXAMPLE1_7(注意,SAS 数据集名不区分大小写,因此 CHAP1.EXAMPLE1_7与chap1.example1_7指向同一个文件)。此时可以直接单击Finish(完成)按钮实现数据集导入。
图1-11 导入数据——确定数据集名
注意:若单击图1-11所示对话框上的Next 按钮,在弹出的对话框中指定完成数据导入的SAS 数据集的程序名及存储位置,此后可直接打开该程序(如以上操作的SAS 程序如图1-12所示),更改SAS数据集名和原始数据位置即可快捷实现数据导入。此操作适用于需导入多个同一类别的数据文件。
图1-12 导入数据——SAS程序
问题(2)的操作过程如下。
步骤一:选择菜单File|Export,弹出如图1-13所示对话框,在Library(逻辑库)下拉列表中选择CHAP1,在Member(对象)下拉列表中选择数据集EXAMPLE1_7,单击Next按钮弹出如图1-14所示对话框。
图1-13 导出数据——选择数据集
图1-14 导出数据——选择数据类型
步骤二:在此选择导出数据格式Microsoft Excel 5 or 95 Workbook(*.xls)(EXCEL工作簿),单击Next按钮进入图1-15所示对话框。
图1-15 导出数据——确定存储路径
步骤三:确定导出文件存储路径和文件名“E:\data\chap1\height.xls”,单击 Finish(完成)按钮完成数据导出。
注意:与导入文件类似,导出过程可保存完成操作过程的SAS程序,更改相应部分实现数据的快速导出。