前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【SAS Says】基础篇:读取数据(中)

【SAS Says】基础篇:读取数据(中)

作者头像
数说君
发布2018-03-28 16:25:28
2.5K0
发布2018-03-28 16:25:28
举报
文章被收录于专栏:数说工作室数说工作室

特别说明:本节【SAS Says】基础篇:读取数据(上),用的是数说君学习《The little SAS book》时的中文笔记,我们认为这是打基础的最好选择。

复习:

前面三节

  • 【SAS Says】基础篇:SAS软件入门(上)
  • 【SAS Says】基础篇:SAS软件入门(下)
  • 【SAS Says】基础篇:读取数据(上)

前面在“基础篇:读取数据(上)”中我们介绍了list input的数据读取方式,如果原始数据是用空格分隔的那么可以用这种读取方式,这种读取方式要求变量值不能包含空格,并且不能跳过某些值,只能用符号“.”来代表缺失。但是,当数据不是空格分隔的,或者没用用句号代替缺失值,或者变量值中肯定要包含空格时怎么办?比如有一个address变量,大家知道地址中很多都带有空格的,现在就有一个地址是“Columbia Peaches”,要怎么读取?别着急,本章中将介绍另外两种读取方式:column input和informats,以及如何同时利用这三种方式读取数据。

此外,本节还要介绍如何处理那些凌乱的数据,如数据中出现不需要的乱码如何不读取、如何读取某个特定字符后面的数据、如何让SAS遇到空格就停止读取等等。

本节目录:

读取数据(下)

2.6 column input读取按固定排列的原始数据

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

2.8 用可选变量形式

2.9 混合读取方式

2.10 读取凌乱的原始数据

2.11 跨行观测值的读取方式


读取数据(中)

2.6 column input读取按固定列排列的原始数据

当一些原始数据的值之间没有空格分开,或者没用用句号代替缺失值时,list input就不能用。但当每个变量的值都出现在数据行的相同位置时,并且变量值是字符串或者标准数值(只包含数据、小数点、正负号、和科学标注的E。逗号和日期都不能算)时,可以使用column input来读取。

相比list input,column input有如下优势:

  • 不要求变量值之间的空格;
  • 缺失值可以直接用空格代替;
  • 字符串中可以包含空格;
  • 可以跳过不需要的变量。

调查数据使用column input,因为调查答案的记录都是用单个数字(0-9),如果每个答案之间再用空格分开,就会使整个文件会扩大两倍。有地址的数据文件也使用 column input,因为地址之中常常包含空格,比如街道Martin Luther King Jr.Boulevard在column input中就可以当成一个变量而不是五个。可能用column input读取的数据也可以用formattedinput读取或者几种方式组合。

Column input的input语句格式如下:input关键字后接变量名、再接变量的列位置(列位置是字符或者数值在一行中的位置)。字符串变量名后仍要用“空格+$”,变量名之间仍要用空格隔开。示例如下:

这个语句表明,Name变量,在行中占据第1列第10列,为字符串变量,age占据第11-13列,为数值变量,height占据第14-18列,数值变量。

例子 原始数据记录如下:

读取这个数据的column input程序如下:

第一个变量visitingteam占据第1-20列,为字符变量;concessionsales占据第21-24列,为数值变量,下面几个变量均占据固定的列。输出结果如下:

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

有时候原始数据不全是字符串或者数值,比如类似1,00,001这样包括逗号的字符串值,电脑就不能读取,其他诸如包含美元符号、十六进制、压缩十进制的数据都是非标准数据。SAS中,informats可以用来告诉电脑如何读取这样的数值。

日期是最普通的非标准数据,SAS informats会把类似10-31-2003或者31OCT03转换成数字,日期的起点为1960年1月1日,即这一天的数字为0。

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

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

Name为字符串变量,占据10个宽度,即列位置从1-10;age为数值变量,占据3个宽度,列位置从11到13;height也为数值变量,占据5个宽度,包括了1位小数点和小数点本身,列位置从14-18(如150.3);最后是日期变量,从第19列开始,形式为MMDDYY。

例子 原始数据如下:

读取这个数据的informat程序如下:

年龄后面的+1代表跳过一列,即原始数据中年龄后面有一个空格。最后的5个变量score1-score5,都要求有同样的形式,4.1。将变量名和形式分别放在两个括号集中,可以一次性定义很多变量。输出结果如下:

2.8 可选择变量形式

一般使用的变量形式的定义,以及它们的宽度范围和默认宽度如下:

2.9 混合读取方式

每种数据读取方式都有其优势,list最简单,column和formatted虽然复杂但是不要求变量之间的空格,并且变量名中可以包含变量,而且formatted可以读取特殊的数据比如日期。SAS可以灵活的让你搭配不同的读取方式,以达到最大的方便。

例子如下的原始数据记录了美国国家公园的信息:姓名(name)、所属周(state)、建立时间(year established)、占地面积(size inacre):

有多种方式进行数据读取,下面的程序是方式之一:

其中ParkName是column方式读取,State和Year是list方式读取,Acreage是formatted方式读取,输出结果如下所示:

混合读取方式有时会遇到问题:SAS通过一个指示器标注位置,来读取原始数据的一行,但每种读取方式对指示器的使用稍有不同。List方式下,SAS自动找到非空格区域并开始读取;column方式下,SAS读取你所指定的特定位置;informatted方式下,SAS不理会指示器的标准,只是依次的读取。这时,就会需要列指示器@n,来人为的让SAS的读取直接跳至某列。

在上面的程序中,列指示器@40告诉SAS在读取Acerage变量之前,移动到第40列去,如果移去指示器,程序为:

输出结果如下图所示:

之所以出现这样的结果,要看原始文件的列坐标排列:

Comma9告诉SAS读取9列,SAS就会读取包括空格在内的9列,这便会导致输出结果的问题。

2.10 读取凌乱的原始数据

有的数据排列混乱,长度不一。这样的数据需要新的工具处理:@’character’ 列指示器和colonmodifier。

@’character’列指示器 2.9中提到@column列指示器可以让SAS直接从某列开始读取数据。但有时候你不知道要读取的数据是从哪列开始,此时你只要知道要读取的数据的前面那个字符或单词即可。比如有一个关于狗的原始文件,你想要读取狗的品种号,但文件排列很凌乱,只知道品种号跟随在单词breed后面,那么可以用如下方式读取:

Input @’Breed:’ DogBreed $;

colonmodifier 由于input读取字符串变量默认为8个字符,因此在上例中如果狗的品种名(dogbreed)超过8个字符,则需要定义长度,定义为$length,在该长度中,空格也算在内。如果要使SAS读取过程中遇到空格则不再继续读取,则要在$length前面加冒号“:”。比如原始数据中有这么一行:

My dog Sam Breed:Rottweiler VetBills:$478

如果用上述不同方法读取,会有不同结果:

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

现在想要读取访问日期和访问的文件名,但是它们每行中所占据的列的位置都不同,而且文件名的长度每行都不一样,那么SAS读取这种文件通过如下方式:

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

2.11 跨行观测值的读取方式

一般原始文件中一行代表一个观测值,有时会出现一个观测值跨行的情况。由于SAS会自动转到下一行读取数据,直到读取这个观测的所有变量(input语句中给出),所以你需要告诉SAS什么时候不要换行,以便在日志中不出现SAS-went-to-a-new-line的暂停说明,此时需要在INPUT语句中加行指示器。

行指示器 斜线/:告诉SAS跳至原始数据的第二行;#n:跳至第n行,n代表原始数据中某观测值的行数(#2则让SAS跳至某观测值的第二行),#n不能用来回跳。

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

用如下的程度来读取这份数据:

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

日志记录如下:

从日志中可以看出,虽然原始原件占了9行,但只有三个观测值。

输出结果如下:


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数说工作室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 读取数据(中)
  • 2.6 column input读取按固定列排列的原始数据
  • 2.7 informats读取非标准格式的原始数据
  • 2.8 可选择变量形式
  • 2.9 混合读取方式
  • 2.10 读取凌乱的原始数据
  • 2.11 跨行观测值的读取方式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档