《The Little SAS Book》学习笔记—Chapter2(2) DATA步中常见的读取数据方式
内容参考书籍:《The Little SAS Book》中文版
在SAS程序中,使用DATA步进行数据的读取和创建SAS数据集是一种常见的方式,接下来,将根据原数据的内容的格式不同,介绍SAS程序DATA步常见的几种数据读取形式。
读取空格分割的原始数据(列表输入)
- 适用情形:原始文件中数据与数据之间至少存在一个空格分割符,合适的方式是使用列表输入读取该数据。
- 局限性:
- 读取全部数据,无法跳过部分数据;
- 原始数据缺失值需要使用
.
进行标识; - 字符型数据内部不能内嵌空格,长度小于8字符;
- 日期等特殊类型数据不适用。
-
使用:
在DATA步中,只需在INPUT
关键字后面按照原数据中出现的顺序罗列出变量名称。 -
示例
原数据存储位置d:/mydata/test.dat
, 文件内容如下:
Jack 16 . 57
Tom 17 . .
Lily 18 165 50
David 18 178 67
在DATA步中使用INPUT
关键字读取:
*创建一个名为test的数据集;
*使用列表读入,读取test.dat数据文件;
DATA test;
INFILE 'd:/mydata/test.dat';
INPUT name $ age height weight;
RUN;
*打印数据以确保被正确读取;
PROC PRINT data = test;
TITLE "SAS test data set";
RUN;
-
打印结果
打印输出的结果如下表所示:
Obs | name | age | height | weight |
---|---|---|---|---|
1 | Jack | 16 | . | 57 |
2 | Tom | 17 | . | . |
3 | Lily | 18 | 165 | 50 |
4 | David | 18 | 178 | 67 |
-
说明
在原数据中空格分割的缺失值,在打印结果的表中以.
显示。
读取按列排列的原始数据(按列输入)
- 适用情形:
- 每个变量值能在数据行的相同位置找到,值之间可以无需空格;
- 变量值之间或者缺失值没有分隔符或者点标识,缺失值可以留空;
- 字符数据可以内嵌空格 ;
- 可以跳过不需要的变量;
- 局限性:
- 所有值必须是字符型或者标准数值型,即:数字,小数点,正负号和E;
- 带有内嵌逗号和日期格式数据不适用。
-
使用:
在DATA步中,只需在INPUT
关键字列出变量名,留出空格后,标明变量对应的列范围;如果是字符型,则在变量名后留出空格标注$
符号,再标明变量对应的列范围。 -
示例
示例数据是书中的数据,最顶部的标尺是为了方便确定列数,原数据内容如截图所示:
在DATA步中使用INPUT
关键字读取:
DATA test;
INFILE 'd:/mydata/test.dat';
INPUT VisitingTeam $ 1-20 ConcessionSales 21-24 BleacherSales 25-28 OurHits 29-31 TheirHits 32-34 OurRuns 35-37 TheirRuns 38-40;
RUN;
PROC PRINT data = test; /*打印数据以确保被正确读取*/
TITLE "SAS test data set";
RUN;
-
打印结果
读取非标准格式的原始数据(格式化输入)
SAS中的标准格式只有两种类型,字符型和数值型。但是日常使用过程中还需遇到像日期和内嵌逗号的数值等数据。这个时候简单的列表读取会导致数据格式有误。在SAS中通过使用输入格式告知计算机如何解读这些数据。
- 适用情形:
- 非标准格式数据,如内嵌逗号和美元符号的数值,十六进制或者压缩十进制数据;
- 日期数据的读取,SAS实际是把日期数据转换成了和1960年1月1日的天数差作为数值进行存储。
-
使用:
SAS中输入格式的三个基本类型是:字符型、数值和日期。一般形式是:
字符
$INFORMATw.
数值
INFORMATw.d
日期
INFORMATw.
-
$
符号标识字符型,INFORMAT
是格式,w.
指明长度; - 在数值型输入格式中,
w
指明长度,d
指明小数点后的位数; - 句点对于格式中长度的规定很重要,没有句点,w会被解释为格式名;
4.$w.
用来读取标准的字符型数据,w.d
用来读取标准的数值型数据;
-
示例
原数据存储位置d:/mydata/test.dat
, 文件内容如下:
Wang Xiaoming 14 10-10-2016 4.45 4.35 4.75 4.32 4.36
Li Lei 17 15-10-2016 4.17 4.75 4.32 4.75 4.75
Zhao Xiaoli 15 16-10-2016 4.11 4.17 4.75 4.75 4.11
Liu Linlin 16 12-10-2016 4.56 4.35 4.75 4.11 4.17
使用规定输入格式在DATA步中使用INPUT
关键字读取上述的数据,注意也可以用其他方式读取:
DATA test;
INFILE "d:/mydata/test.dat";
INPUT name $13. age 2. +1 birthday DDMMYY10. +1 (Score1 Score2 Score3 Score4 Score5) (4.2);
RUN;
PROC PRINT data = test;
RUN;
-
打印结果
打印输出的结果如下表所示:
Obs | name | age | birthday | Score1 | Score2 | Score3 | Score4 | Score5 |
---|---|---|---|---|---|---|---|---|
1 | Wang Xiaoming | 14 | 10-10-2016 | 4.45 | 4.35 | 4.75 | 4.32 | 4.36 |
2 | Li Lei | 17 | 15-10-2016 | 4.17 | 4.75 | 4.32 | 4.75 | 4.75 |
3 | Zhao Xiaoli | 15 | 16-10-2016 | 4.11 | 4.17 | 4.75 | 4.75 | 4.11 |
4 | Liu Linlin | 16 | 12-10-2016 | 4.56 | 4.35 | 4.75 | 4.11 | 4.17 |
- 说明
- 变量
name
的格式是$13.
,它表示一个宽度为13列的字符变量; - 变量
age
的输入格式是2.
,表示一个宽度为2列的数值变量,只有整数部分,没有小数部分; - 变量
birthday
的输入格式是DDMMYY10.
,它表示了10列宽度的日-月-年形式的日期数据; - 其它的变量
Score1
到Score5
的格式都是4.2
,把这几个变量名放在了同一个小括号里,就可以在随后的小括号里只规定一次便适用于所有的变量。
共有 0 条评论