参考书籍:《The Little SAS book》
1 导入内部数据
DATA后接数据集名称;INPUT后为变量名称,变量与变量间用空格隔开,如果变量是字符型,名称后要用空格和$,所以图中President和Party为字符型数据,Number为数值型数据;DATALINES表示下面直到用分号结尾的是数据,命令CARD与DATALINES有一样的作用;RUN表示数据步结束。
2 导入外部数据
用 INFILE ‘数据文件地址’ 导入数据。对于内容如下的数据文件President.dat:
将其导入SAS的代码:
INFILE函数的选项:
- 当需导入的数据过长时(长度超过256),在INFILE语句后用LRECL指定长度。
INFILE 'c:\Myrawdata\data.dat' LRECL=2000;
- 当数据分隔符不为空格时(空格为默认的分隔符),在INFILE语句后用DLM修改分隔符。如分隔符为逗号:
INFILE 'c:\Myrawdata\data.dat' DLM=',';
- 当数据的缺失值用两个分隔符表示时(默认是用’.‘表示),在INFILE语句后用DSD修改。如分隔符为逗号,缺失值用两个逗号表示时:
INFILE 'c:\Myrawdata\data.dat' DLM=',' DSD;
- 当需要指定从文件某一行开始读取数据时,在INFILE语句后用FIRSTOBS指定开始读取的行号。如需要从文件的第三行开始读取数据:
INFILE 'c:\Myrawdata\data.dat' FIRSTOBS=3;
- 当需要指定在文件的某一行结束读取数据时,在INFILE语句后用OBS指定读到哪一行。如,只读取文件第三到第五行的数据:
INFILE 'c:\Myrawdata\data.dat' FIRSTOBS=3 OBS=5;
- 当需要将文件中未赋值的变量读取为缺失值时,在INFILE语句后用MISSOVER。(在 input 语句中输入的几个变量,SAS 在观测值中就读取几个变量,如果一行未读完,则进入下一行直到输入的变量都读取了变量值。)
如对于学生的5门课程的成绩数据,由于有的学生没有选课所以没有成绩:
代码:
在INFILE函数的基础上,针对不同格式的外部数据以及读取所有数据还是部分数据INPUT语句中有不同的处理方法,以下分别说明:
2.1 读取所有数据
用空格分开的原始数据(list input)
list input的使用条件比较苛刻,适用于“简单”且“完美”的数据集,要求:
- 数据用空格分开
- 缺失值用“.”代替
- 字符串数据不包含空格
- 长度不超过 8 个字符
- 无日期变量或者其他需要特别处理的变量
INPUT A $ B C;
该语句读取A为字符型数据,B和C为数值型数据。
变量在固定列的原始数据(column input)
要求:
- 每个变量的值都出现在数据行的相同位置
- 变量值是字符串或者标准数值(只包含数据、小数点、正负号、和科学标注的 E。逗号和日期都不能算)
INPUT A $ 1-10 B 11-15 C $ 15-17;
这个语句中,字符型变量A在第1到10列,数值型变量B在第11到15列,字符型变量C在15到17列。
非标准格式的原始数据(informats input)
informats读取的三种格式:字符串、数值和日期
字符串读取格式:变量名 $w.
数值读取格式:变量名 w.d
日期读取格式:变量名 日期格式w.
informats还有其它变量形式可选,可自行查询变量形式定义和使用格式。
其中,w为宽度,d为小数点位数。
INPUT A $10. B 3.2 C 3. D MMDDYY10.;
这个语句中,A为宽度为10的字符串,B为宽度为3、小数点位数为2的数值,C为宽度为3、无小数点位数的数值,D为格式为月日年宽度为10的日期。
混合读取方式
INPUT A $ 1-18 B $ C D YYMMDD11.;
这个语句中,A用的是column input,为在第1-18列的字符型数据;B用的是list input,为字符型数据;C用的是list input,为数值型数据;D用的是informats input,为宽度为11、格式为年月日的日期。
读取凌乱数据
- @+符号、字符和数值 列指示器,让程序直接从某列开始读取数据。
- :在$w.前加:,让程序在遇到空格时结束读取。
对于AAAA BBBBB
INPUT A :$10.;
读取的是AAAA;
INPUT A $10.;
读取的是AAAA BBBBB。
INPUT @'[' A YYMMDD11. @'name:' B $ @30 C :$10.;
这个语句中,A为’['后面的宽度为11的日期;B为’name:'后面的字符串;C为第30列开始的宽度为10的字符,且遇到空格停止读取。
-
/ 让程序跳至原始数据的第二行。
-
#n 让程序跳至原始数据的第n行。
-
INPUT语句末尾的@和@@ 行停留指示符,@能使 SAS 停留到下一个 input 语句,@@能使停留的时间到下一个data 步。
首先了解数据步的运行方式:数据步按照一行一行、一个观测值一个观测值的顺序执行
示意图:
data ch1;
input x@;
input y;
input z@@;
datalines;
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
;
run;
proc print data=ch1;
run;
对于这个例子,首先执行第一行1 2 3 4 5,x得到值1,@表示停留在第一行,y得到值2,@失效,执行第二行6 7 8 9 10,z得到值6,@@表示停留在第二行,再进入数据步,x得到值7,@@失效,@生效,y得到值8,@失效,执行第三行,z得到值11。
输出结果:
通过行停留指示符@,可以用IF语句来筛选数据进行读取: