真新镇的涅法雷姆 2020-01-02
目录
将数据导入SAS的方法有很多,但可以归纳为四个基本类别,其中方法2、3是需要掌握的重点。
导入向导默认数据第一行作为变量名称,并会自动扫描文件来决定变量的类型
使用导入向导导数一般分以下几个步骤:
根据原始数据存储的不同位置,可以分为内部原始数据、外部原始数据。用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;
如果原始数据文件中的所有值,都被至少一个空格分隔开,建议使用列表输入(list input)读入该原始数据,该方法也被称为自由格式输入。
下面是列表输入的优缺点:
特别注意,列表输入也可用于读取其他分隔符数据文件,如逗号或制表符。并且,可以使用length语句去覆盖长度不超过8个字符的限制,使字符变量长度变成1 ~ 32767之间任意值。
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;
列输入和列表输入类似,但适用范围更广,具有以下几点优势:
通常调查数据、带有街道地址的数据集,可采用列输入读取。
INPUT语句
列输入也是通过input语句实现数据读入,语法规则和列表输入类似,区别在于变量之后需要列出该变量对应的列或者列范围,用这些列表示数值或者字符在数据行中的位置。
示例:input Name ¥ 1-10 Age 11-13 Height 14-18;
先明确一个概念「标准格式数据」,只包含数字、小数点、正负符号、科学计数法E。其他的都是非标准格式数据,常见的有:
日期
嵌入逗号的数字
嵌入$符号的数值
输入格式
输入格式的三个基本类型是:字符、数值、日期
字符 | 数值 | 日期 |
---|---|---|
$informatw. | informatw.d | informatw. |
$表明这是字符型输入格式,imformat是该输入格式的名称,w是总宽度,d是小数位数(仅限数值型输入格式),注意,一定不要少些了句点(.)。有两个输入格式没有名称:?
格式化输入
在input语句的变量名称之后放置输入格式,称为格式化输入。
示例:input name $10. age 3. height 5.1 birthdate mmddyy10. ;
先明确一个概念:为每个变量读取的列,由起始点和输入格式的宽度所决定。所以,上面的示例代码就能解读为:
*读取非标准格式的原始数据; 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 常用输入格式。
前面学习了三种主要的输入样式:
因为SAS中数据格式多种多样,没有一种输入样式能满足绝大多数需求。所,更多时候我们采用混合的样式输入。
示例:input parkname $ 1-22 state $ year @40 acreage comma9. ;
上面的示例就采用了多种样式的组合:
此外,还用了列指针,语法@n,n指SAS要移动到的列,常用来在一行数据里向前或者向后移动,以调整数据读取起始位置,应用场景有: