#SAS学习-数据高级导入

关于SAS的数据导入方式其实挺多的,比如最简单的向导导入,也有简单的import,infile方式导入,但是,这些对于相对比较整洁的数据或者标准格式的数据来说是比较实用的,但是对于稍微有一些“不那么正常”的数据就可能束手无策了,今天就我自己关于这块的研究,做一个简单的总结呗,以免日后忘记。

0?wx_fmt=jpeg

下面就一些实际的情况进行代码实现,并没有什么先后顺序之分啦,只是想到什么就写什么。

一、informats读取非标准格式的原始数据

有时候原始数据不全是字符串或者数值,比如类似1,00,001这样包括逗号的字符串值,电脑就不能读取,其他诸如包含美元符号、十六进制、压缩十进制的数据都是非标准数据。日期也是最普通的非标,准数据

Informats的三种普遍格式为:字符串、数值、日期。这三种格式的形式如下:

0?wx_fmt=png

$代表是字符串、informats代表形式(比如日期的MMDDYY)、w是宽度、d是小数点的位数、最后是句号“.”,缺少句号会使得SAS把形式(如MMDDYY)当做变量名。

二、@’character’ 列指示器

@column列指示器可以让SAS直接从某列开始读取数据。但有时候你不知道要读取的数据是从哪列开始,此时你只要知道要读取的数据的前面那个字符或单词即可

此外,input读取字符串变量默认为8个字符,若超过8个字符,则需要定义长度,定义为$length,在该长度中,空格也算在内。如果要使SAS读取过程中遇到空格则不再继续读取,则要在$length.前面加冒号“:”。

例子:

web日志是凌乱数据的一个很好例子,下面是一个网站的web日志,数据开始于访问IP,后面有访问日期、访问文件名等信息。

0?wx_fmt=png

实现代码:

0?wx_fmt=png

@’[’作为列指示器,告诉SAS读取[之后的内容,@’GET’告诉SAS读取GET之后的内容,由于文件名作为字符串变量,这里基本都会超过8个字节,因此后面附加:$20。

输出结果:

0?wx_fmt=png

三、行指示器控制导入多行数据

一般原始文件中一行代表一个观测值,有时会出现一个观测值跨行的情况。所以你需要告诉SAS什么时候不要换行,这个时候就需要用到行指示器。

斜线/:告诉SAS跳至原始数据的第二行;

#n:跳至第n行,n代表原始数据中某观测值的行数(#2则让SAS跳至某观测值的第二行);

例子:

有一组关于温度的数据,temperature.dat第一行代表城市和州,第二行代表本日最高温和最低温,第三行代表史上最高温和最低温。

0?wx_fmt=png

代码读入:

0?wx_fmt=png

Input后面告诉SAS读取第一行的city变量和state变量,斜线/告诉SAS移动到下一行的第一列,以便读取normalhigh和normallow。#3告诉SAS移动到第三行的第一列以便继续读取观测值的recordhigh变量和recordlow变量。这里/可以用#2代替,也可以用/代替#3。

输出结果如下:

0?wx_fmt=png

四、导入特定观测值的数据

有时候需要只是导入特定数据,有点类似于Excel的筛选功能,这个时候可以在input语句结尾加符号@,叫做a trailing at(called a trailing at),这告诉SAS先停在(hold)此行,同时用IF语句检测此观测值是否满足需要,如果是,那么可以再用一个input语句来读取现有的变量。

0?wx_fmt=png

例子:

有一个关于当地交通的数据,traffic.dat数据包含街道的类型(freeways和surface)、街道名称、早晨每小时的机动车流动量、晚上每小时机动车流动量。如果现在你只需要其中一种街道类型的freeway数据,如何实现?

代码实现:

第一个input读取字符串变量,@是SAS停留在观测值上并用IF检测,第二个input读取input后面的变量值。

程序执行后日志包括两部分说明,一个说明读取了8个记录,另一个说明新数据集中只包含三个观测值。

输入结果如下所示:

0?wx_fmt=png

输出结果:

0?wx_fmt=png

五、更高级的@:@@

@的作用类似于@@,都是行停留指示符(line-hold specifiers),不同地方在于停留多久,@能使SAS停留到下一个input语句(也不换行),@@能使停留的时间到下一个data步(也不换行)。

比如这段代码:

datatest;                                                                                                                             

    infile cards;                                                                                                                     

    input x @;

    input y;

    input z @@;

cards;                                                                                                                                 

1 2 3 4 5 6

7 8 9 10 11 12

13 14 15 16 17; 

run;

test输出结果就是:

0?wx_fmt=png

PS:关于@和@@的结尾,必须要有“回车”标识,不然就结束此次运行)

六、infile控制读取数据

infile语句有很多选项,而这些选项可以让SAS读取这些特殊数据。

1)FIRSTOBS:

告诉SAS从哪一行开始读取数据,当数据开头有些说明信息,或者想要跳过某些行时,这个选项很有用。

2)OBS:

告诉SAS一直读取到哪一行位置。用FIRSTOBS=3和OBS=5就可以读取第三行到第五行的数据:

3)MISSOVER:

在input语句中输入的几个变量,SAS在观测值中就读取几个变量,如果一行未读完,则进入下一行直到输入的变量都读取了变量值。missover可以让SAS不进入下一行读取,未赋值的变量就使其成为缺失值。

例子:一个学生应该有5门课的成绩,但由于最后两门是自学课程,不是所有学生都完成,故而缺失:

0?wx_fmt=png

使用Missover可以把没有成绩的设为缺失值,从而不牵扯到下一行:

4)Truncover:

使用column input或formatted input输入时可能会需要这个选项,因为这时有的数据行比其他的短。如下的原始数据中,由于三行的长度都不一样,input中只能指定最长的一行:

0?wx_fmt=png

程序如下:

0?wx_fmt=png

这里指定了第二行的长度street $22-37,但是第一行mapleave.并没占够至第37列(注意后面是没有空格的),故而必须用truncover,否则会转到下一行继续读取,第三行情况也是。

七、读取分隔符文件

分隔符文件中,变量值之间会用一些特殊的字符隔开,比如逗号或制表符。DLM=和DSD选项可以让SAS容易地读取这些分隔符文件。

1)DLM/DELIMITER:

0?wx_fmt=png

如果原始数据是用制表符隔开的,那么可以使用DLM=’09’X来指定。

2)DSD:

这个选项有3个作用:

① 忽略引号中数据的分隔符,例如一个观测Joseph,76,"Red Racers, Washington"非引号中的逗号能识别成分隔符,而引号中的逗号不能识别;

② 自动将字符串中的引号去掉;

③ 将两个相邻的分隔符当作缺失值来处理。

八、用IMPORT procedure读取分隔符文件

这个就不多说,直接贴上statement。

0?wx_fmt=png

0?wx_fmt=jpeg

上面讲了8种比较重要以及常用的数据导入的方式方法,应该也差不多了,导入数据是最基础的操作,所以也需要多花点时间去研究一下~

讲完导入数据,接下来的一篇文章我会写一个关于”修改数据“的文章,因为新导入的数据,肯定在数据类型,数据格式方面不太适合我们去做数据统计和分析的,所以,需要我们进一步对数据进行处理~

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值