第二章 导入数据到SAS | 格式规范数据读取
目录
2.1 导入数据的方法
将数据导入SAS的方法有很多,但可以归纳为四个基本类别,其中方法2、3是需要掌握的重点。
- 直接将数据输入SAS数据集
- 通过VIEWTABLE窗口(打开方式:工具 → 表编辑器),以表格形式导入
- 通过SAS Enterprise Guide窗,以表格形式导入
- 利用原始数据文件创建SAS数据集
- 通过data步导入
- 通过导入向导 或 有类似功能的import过程导入
- 将其他软件的数据文件转换成SAS数据集
- 通过data步或import过程,把其他类型的数据文件读成SAS数据集
- 直接读取其他软件的数据文件
2.2 利用导入向导读入
导入向导默认数据第一行作为变量名称,并会自动扫描文件来决定变量的类型
使用导入向导导数一般分以下几个步骤:
- 启动:文件 → 导入数据
- 选择导入文件类型
- 选择导入文件
- 选定分隔符:左击options选择,csv和制表符(Tab)分隔文件SAS会自动识别
- 指定逻辑库和数据集名称
- fish结束
2.3 格式规范数据读取
2.3.1 指定原始数据位置(infile)
根据原始数据存储的不同位置,可以分为内部原始数据、外部原始数据。用infile
语句来指定元数数据位置。
内部原始数据
如果在SAS程序中输入数据,则这些数据被称为内部原始数据,使用「datalines语句」表明它。需注意的是,datalines语句必须是data步最后一条语句,其后的所有行都将被视为数据行,直到遇到一个分号(;)为止。
*将内部原始数据读入到SAS数据集; data work.testdata; input president $ party $ number; /* 输入指定类型的3个变量 */ datalines; /* 数据线 */ Adams F 2 Lincoln R 16 Grant R 18 kennedy D 35 ; run;
外部原始数据
更常见数据是保存在外部文件中,这时数据与程序是分离的,就称为外部原始数据。需要用「infile语句」告知SAS文件名和路径,infile语句紧跟在data语句之后,input语句之前,且不同操作环境中路径表示有差异:
操作环境 | infile语句 |
---|---|
windows | infile ‘D:\code\test.dat‘; |
unix | infile ‘/home/rds/test.dat‘; |
os | infile ‘mydir.test.dat‘; |
长记录
当从外部数据文件读入数据时,务必记得「检查日志」,因为一些非常有价值的信息,会在日志中体现,如观测数、变量数、记录最大/最小长度。
若外部文件中记录长度超过了256个字符,且SAS没有读取到所有数据,这时可以在infile语句中使用lrecl=
选项,指定一个至少和数据文件中最长记录等长的长度。
*从外部原始数据读入数据到SAS数据集; data work.testdata; infile infile 'D:\code\test.dat' lrecl = 300; /* 指定记录长度最大为300个字符 */ input president $ party $ number; run;
2.3.2 读取空格分隔原始数据(列表输入)
如果原始数据文件中的所有值,都被至少一个空格分隔开,建议使用列表输入(list input)读入该原始数据,该方法也被称为自由格式输入。
下面是列表输入的优缺点:
- 优点:简单好用
- 缺点:
- 只能读取一条记录中全部数据,不能跳过不需要的值
- 如果有字符型数据,那它必须没有内嵌空格,且长度不超过8个字符
- 如果数据文件含日期、其他特殊格式数据,那列表输入不适用
特别注意,列表输入也可用于读取其他分隔符数据文件,如逗号或制表符。并且,可以使用length语句去覆盖长度不超过8个字符的限制,使字符变量长度变成1 ~ 32767之间任意值。
INPUT语句
列表输入是通过input语句实现数据读入,语法规则如下:
- 在input关键字后,按照变量名称出现顺序依次列出它们
- 变量名称符合命名规则
- 若变量为字符类型,则在变量名称后面加一个$
- 变量名称之间至少留一个空格
示例:input toadname $ weight jump1 jump2 jump3;
*使用列表输入,读取数据文件ToadJump.dat; data toads; infile 'D:\code\ToadJump.dat'; input toadname $ weight jump1 jump2 jump3; run; proc print data = toads; title '蟾蜍跳跃比赛'; run;
2.3.3 读取按列排列原始数据(列输入)
列输入和列表输入类似,但适用范围更广,具有以下几点优势:
- 值之间无须空格
- 缺失值可以留空
- 字符型数据可以内嵌空格
- 可以跳过不需要的变量
通常调查数据、带有街道地址的数据集,可采用列输入读取。
INPUT语句
列输入也是通过input语句实现数据读入,语法规则和列表输入类似,区别在于变量之后需要列出该变量对应的列或者列范围,用这些列表示数值或者字符在数据行中的位置。
示例:input Name ¥ 1-10 Age 11-13 Height 14-18;
2.3.4 读取非标准格式的原始数据(格式化输入)
先明确一个概念「标准格式数据」,只包含数字、小数点、正负符号、科学计数法E。其他的都是非标准格式数据,常见的有:
日期
嵌入逗号的数字
嵌入$符号的数值
输入格式
输入格式的三个基本类型是:字符、数值、日期
字符 | 数值 | 日期 |
---|---|---|
$informatw. | informatw.d | informatw. |
$表明这是字符型输入格式,imformat是该输入格式的名称,w是总宽度,d是小数位数(仅限数值型输入格式),注意,一定不要少些了句点(.)。有两个输入格式没有名称:?
- $w. 用来读取标准的字符型数据
- w.d 用来读取标准的数值型数据
格式化输入
在input语句的变量名称之后放置输入格式,称为格式化输入。
示例:input name $10. age 3. height 5.1 birthdate mmddyy10. ;
先明确一个概念:为每个变量读取的列,由起始点和输入格式的宽度所决定。所以,上面的示例代码就能解读为:
- name($10.):字符型数据,默认起始列在第1列,name数据在第1 ~ 10列
- age(3.):数值型数据,起始列在第11列,往后取3列
- height(5.1):数值型数据,起始列在第14列,往后取5列,小数位数为1
- birthdate(mmddyy10.):日期数据,格式为月-日-年,能读取诸如10-31-2013或10/31/2013格式的日期,起始列在第19列,往后取10列
*读取非标准格式的原始数据; data zdata.contest; infile 'D:\data\sas_file\pumpkin.dat'; input name $16. age 3. +1 type $1. +1 date mmddyy10. /* +1表示跳过一列 */ (score1 score2 score3 score4 score5) (4.1); run;
有相同输入格式,把变量和输入格式分别放到括号中,输入格式只列出一次 即可。
更多常见的常见输入格式见page49,第二章 2.8 常用输入格式。
2.3.5 混合的输入样式(列表输入+列输入+格式输入)
前面学习了三种主要的输入样式:
- 列表输入:最简单
- 列输入:稍微难一点
- 格式化输入:最复杂
因为SAS中数据格式多种多样,没有一种输入样式能满足绝大多数需求。所,更多时候我们采用混合的样式输入。
示例:input parkname $ 1-22 state $ year @40 acreage comma9. ;
上面的示例就采用了多种样式的组合:
- parkname ($ 1-22):列输入
- state($):列表输入
- year:列表输入
- acreage (comma9):格式化输入
此外,还用了列指针,语法@n,n指SAS要移动到的列,常用来在一行数据里向前或者向后移动,以调整数据读取起始位置,应用场景有:
- 跳过不需要的数据
- 使用不同的输入格式两次读取同一个变量