第二章 导入数据到SAS | 格式规范数据读取

真新镇的涅法雷姆 2020-01-02

目录

2.1 导入数据的方法

将数据导入SAS的方法有很多,但可以归纳为四个基本类别,其中方法2、3是需要掌握的重点。

  1. 直接将数据输入SAS数据集
    • 通过VIEWTABLE窗口(打开方式:工具 → 表编辑器),以表格形式导入
    • 通过SAS Enterprise Guide窗,以表格形式导入
  2. 利用原始数据文件创建SAS数据集
    • 通过data步导入
    • 通过导入向导 或 有类似功能的import过程导入
  3. 将其他软件的数据文件转换成SAS数据集
    • 通过data步或import过程,把其他类型的数据文件读成SAS数据集
  4. 直接读取其他软件的数据文件

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语句
windowsinfile ‘D:\code\test.dat‘;
unixinfile ‘/home/rds/test.dat‘;
osinfile ‘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.dinformatw.

$表明这是字符型输入格式,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要移动到的列,常用来在一行数据里向前或者向后移动,以调整数据读取起始位置,应用场景有:

  • 跳过不需要的数据
  • 使用不同的输入格式两次读取同一个变量

相关推荐