SAS学习笔记(一):数据导入

参考书籍:《The Little SAS book》

1 导入内部数据

DATA后接数据集名称;INPUT后为变量名称,变量与变量间用空格隔开,如果变量是字符型,名称后要用空格和$,所以图中President和Party为字符型数据,Number为数值型数据;DATALINES表示下面直到用分号结尾的是数据,命令CARD与DATALINES有一样的作用;RUN表示数据步结束。
SAS学习笔记(一):数据导入

2 导入外部数据

用 INFILE ‘数据文件地址’ 导入数据。对于内容如下的数据文件President.dat:
SAS学习笔记(一):数据导入
将其导入SAS的代码:
SAS学习笔记(一):数据导入
INFILE函数的选项:

  1. 当需导入的数据过长时(长度超过256),在INFILE语句后用LRECL指定长度。
INFILE 'c:\Myrawdata\data.dat' LRECL=2000;
  1. 当数据分隔符不为空格时(空格为默认的分隔符),在INFILE语句后用DLM修改分隔符。如分隔符为逗号:
INFILE  'c:\Myrawdata\data.dat' DLM=',';
  1. 当数据的缺失值用两个分隔符表示时(默认是用’.‘表示),在INFILE语句后用DSD修改。如分隔符为逗号,缺失值用两个逗号表示时:
INFILE  'c:\Myrawdata\data.dat' DLM=',' DSD;
  1. 当需要指定从文件某一行开始读取数据时,在INFILE语句后用FIRSTOBS指定开始读取的行号。如需要从文件的第三行开始读取数据:
INFILE  'c:\Myrawdata\data.dat' FIRSTOBS=3;
  1. 当需要指定在文件的某一行结束读取数据时,在INFILE语句后用OBS指定读到哪一行。如,只读取文件第三到第五行的数据:
INFILE  'c:\Myrawdata\data.dat' FIRSTOBS=3 OBS=5;
  1. 当需要将文件中未赋值的变量读取为缺失值时,在INFILE语句后用MISSOVER。(在 input 语句中输入的几个变量,SAS 在观测值中就读取几个变量,如果一行未读完,则进入下一行直到输入的变量都读取了变量值。)
    如对于学生的5门课程的成绩数据,由于有的学生没有选课所以没有成绩:
    SAS学习笔记(一):数据导入
    代码:
    SAS学习笔记(一):数据导入

在INFILE函数的基础上,针对不同格式的外部数据以及读取所有数据还是部分数据INPUT语句中有不同的处理方法,以下分别说明:

2.1 读取所有数据

用空格分开的原始数据(list input)

list input的使用条件比较苛刻,适用于“简单”且“完美”的数据集,要求:

  • 数据用空格分开
  • 缺失值用“.”代替
  • 字符串数据不包含空格
  • 长度不超过 8 个字符
  • 无日期变量或者其他需要特别处理的变量
INPUT A $ B C;

该语句读取A为字符型数据,B和C为数值型数据。

SAS学习笔记(一):数据导入

变量在固定列的原始数据(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行。
    SAS学习笔记(一):数据导入SAS学习笔记(一):数据导入

  • INPUT语句末尾的@和@@ 行停留指示符,@能使 SAS 停留到下一个 input 语句,@@能使停留的时间到下一个data 步。

首先了解数据步的运行方式:数据步按照一行一行、一个观测值一个观测值的顺序执行
示意图:
SAS学习笔记(一):数据导入

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。

输出结果:
SAS学习笔记(一):数据导入
通过行停留指示符@,可以用IF语句来筛选数据进行读取:
SAS学习笔记(一):数据导入

上一篇:体感在js中的调用


下一篇:使用Python和SAS Viya分析社交网络