如何利用the little sas book 学sas
1个回答
展开全部
1)有两种注释方法,一种是*号和;号;一种是用/* */表示,注意第二种注释方法不能放在第一列
2)错误 SAS程序通常将执行的错误标注为醒目的红色字母,你可能忘了分号,拼错了字母,按错了键盘,一个小错误会使得整个程序无法运行。当你看到红色部分多余黑色部分的时候,不要灰心。
3)SAS数据集也被叫做表、观测值也被叫做行、变量也被叫做列
4)字符变量的缺失值用空格表示,数值变量的缺失值用句号(.)表示
5)为变量和数据集命名时要遵守如下规则:
. 名字的长度要小于等于 32 个字节。
. 以字母或下划线开头。
. 可以包含字母、数字、或者是下划线,不能是%$!*@。
. 可以是小写或大写字母,且不区分大小写。
6)SAS程序有两个基本模块:数据步和过程步。
一个典型的SAS程序,由数据步创建SAS数据集开始,再由过程步分析数据。这里有一个例子:数据步中将米转化成千米,过程步中输出结果
DATA step
DATA distance;
Miles = 26.22;
Kilometers = 1.61*Miles;
PROC step
PROC PRINT DATA = distance;
RUN;
数据步和过程步由语句组成(废话),一个过程少至1条语句、多至几百条。新手常犯的错误是将两种过程语句用混,只要记住数据步负责读取、修改数据,过程步负责分析数据、输出报告和效用函数,就不会犯错。
数据步由DATA语句开始:data+数据名。上例中数据步处理了名为distance的数据。为了读取外部数据、未加工的数据,数据步提供了DO LOOPS,IF-THEN/ELSE,以及一些数值和字符函数。数据步也可以按照你想要的方式合并数据集,包括联接(concatenation)和合并(match-merge)。
过程步由proc语句开始:proc+过程名(print、sort、means…),SAS过程步可以处理从数据储存、输出到方差分析、3D图表的一切操作。
典型的程序是以DATA语句开头,输入或修改数据,然后将数据传递给PROC语句。但并不一定非要用这种模式来混合data和proc语句,你可以用任何顺序来排列data和proc两者的顺序,一个程序甚至可以仅有data语句或proc语句。
下面是data语句和proc语句的一些基本不同点:
DATA steps
begin wit DATA statements
read and modifu data
create a SAS data set
PROC steps
begin with PROC statements
perfrom specific analysis or function
produce results or report
7)数据步按照一行一行、一个观测值一个观测值的顺序执行
数据步“一行一行的执行”,这句话很好理解。但很多新手还是容易在这里出错,例如在没有创建一个变量之前就使用它,如果Z变量是X、Y两个变量组合的新变量,那么必须确定创建Z变量的语句在创建X、Y变量语句之后。
而“一个观测值一个观测值的执行”就不是那么容易理解。这意味着SAS先读取一个观测值,然后对这个观测值进行数据步的所有语句(当然也是一行一行的),然后再读取第二个观测值执行。每次执行SAS只有一个观测值。
8)SAS读取的数据的方法主要有以下几种类型:
. 直接输入;
. 从原始数据文件中创建一个SAS数据集(creating SAS data sets from raw data files);
. 将其他软件中的数据文件转换成SAS数据集;
. 直接读取其他软件的数据集;
9)内部原始数据
如果直接将数据输入SAS程序中,那么数据就是SAS内部数据。DATALINES是一个指示,告诉SAS下面跟着是数据行,直到分号结尾,这个分号可以另起一行,也可以接在数据的后面
10)外部原始数据
数据外SAS程序外部时,使用INFILE语句告诉SAS外部数据的文件名和存放路径,它在data语句之后,在INPUT语句之前。INFILE后面的文件名和路径要用引号,各种系统的引用方式各不同:
Windows: INFILE 'C:\Mydir\President.dat';
UNIX: INFILE '/home/mydir/president.dat';
OpenVMS: INFILE '[username.mydir]president.dat';
OS/390 or z /OS INFILE 'MYID.PREDIDEN.DAT';
11)SAS日志
读取外部数据时,SAS日志会给一些很有用的信息,检查这些信息可以解决一些问题,比如对比INFILE语句读取的记录数和数据集中实际观测值,可以确定SAS是否正确的读取了数据
12)过长记录
在一些操作环境中,SAS假定外部数据文件的记录长度为256或更少(记录长度是指某行中的字符数,包括空格),如果长度过长,SAS不能读取全部,此时需要在INFILE语句中使用LRECL=来指定长度,这个长度必须是数据中最长行的长度,如:
INFILE’c:\MyRawData\President.dat’LRECL=2000;
可以通过SAS日志来查看最大记录长度。
13)INPUT语句是数据步的一部分,它告诉SAS如何读取原始数据。使用List input来写input语句:在INPUT关键词之后列出变量名(按照变量在文件中出现的顺序),变量名长度在32个字节(含)以下,只能包含字母、下划线和数据,并必须以字母或者下划线开头。如果变量是字符串,后面要价“$”号,值与值之间至少有一个空格,语句要以分号结束。如: INPUT Name $ Age Height
;
这表明输入三个变量,其中name是字符串,age和height是数值变量
14)column input读取按固定列排列的原始数据
当一些原始数据的值之间没有空格分开,或者没用用句号代替缺失值时,list input就不能用。
但当每个变量的值都出现在数据行的相同位置时,并且变量值是字符串或者标准数值(只包含数据、小数点、正负号、和科学标注的E。逗号和日期都不能算)时,可以使用column input来读取
相比list input,column input有如下优势:
. 不要求变量值之间的空格;
. 缺失值可以直接用空格代替;
. 字符串中可以包含空格;
. 可以跳过不需要的变量。
Column input的input语句格式如下:input关键字后接变量名、再接变量的列位置(列位置是字符或者数值在一行中的位置)。字符串变量名后仍要用“空格+$”,变量名之间仍要用空格隔开。示例如下:
INPUT Name $ 1-10 Age 11-13 Height 14-18;
这个语句表明,Name变量,在行中占据第一列第十列,为字符串变量,age占据第11-13列,为数值变量,height占据第14-18列,数值变量。
15)informats读取非标准格式的原始数据
有时候原始数据不全是字符串或者数值,比如类似1,00,001这样包括逗号的字符串值,电脑就不能读取,其他诸如包含美元符号、十六进制、压缩十进制的数据都是非标准数据。SAS中,informats可以用来告诉电脑如何读取这样的数值。
日期是最普通的非标准数据,SAS informats会把类似10-31-2003或者31OCT03转换成数字,日期的起点为1960年1月1日,即这一天的数字为0。
Informats的三种普遍格式为:字符串、数值、日期。这三种格式的形式如下:
Character $informatw.
Numeric informatw.d
Date informatw.
$是字符串、informats代表形式(比如日期的MMDDYY)、w是宽度、d是小数点的位数、最后是句号".",缺少句号会是的SAS把形式(如MMDDYY)当做变量名。一个简单formatted input的简单INPUT语句如下:
INPUT Name $10. Age 3. Height 5.1 BirthDate MMDDYY10.;
Name 为字符串变量,占据10个宽度,即列位置为1-10;
age为数值变量,占据3个宽度,列位置从11-13;
height为数值变量,占据5个宽度,包括1为小数点和小数点本身,列位置从14-18(如150.3)
最后是日期变量,从第19列开始,形式为MMDDYY
16)混合读取方式
每种数据读取方式都有其优势,list最简单,column和formatted虽然复杂但是不要求变量之间的空格,并且变量名中可以包含变量,而且formatted可以读取特殊的数据比如日期。SAS可以灵活的让你搭配不同的读取方式,以达到最大的方便。
有多种方式进行数据读取,下面额程序是方式之一:
DATA nation;
INFILE 'C:\MYrawdata\park.dat';
INPUT ParkName $ 1-22 STATE $ Year @40 Acreage COMA9.;
PROC PRINT DATA = nation;
TITLE 'Selectes national parks';
RUN;
其中ParkName是column方式读取,State和Year是list方式读取,Acreage是formatted方式读取。
混合读取方式有时会遇到问题:SAS通过一个指示器标注位置,来读取原始数据的一行,但每种读取方式对指示器的使用稍有不同。List方式下,SAS自动找到非空格区域并开始读取;column方式下,SAS读取你所指定的特定位置;informatted方式下,SAS不理会指示器的标准,只是依次的读取。这时,就会需要列指示器@n,来人为的让SAS的读取直接跳至某列。
17)读取凌乱的原始数据
有的数据排列混乱,长度不一。这样的数据需要新的工具处理:@’character’ 列指示器和colon modifier。
@’character’ 列指示器 2.9中提到@column列指示器可以让SAS直接从某列开始读取数据。但有时候你不知道要读取的数据是从哪列开始,此时你只要知道要读取的数据的前面那个字符或单词即可。比如有一个关于狗的原始文件,你想要读取狗的品种号,但文件排列很凌乱,只知道品种号跟随在单词breed后面,那么可以用如下方式读取:Input @’Breed:’ DogBreed $;
colon modifier 由于input读取字符串变量默认为8个字符,因此在上例中如果狗的品种名(dogbreed)超过8个字符,则需要定义长度,定义为$length,在该长度中,空格也算在内。如果要使SAS读取过程中遇到空格则不再继续读取,则要在$length前面加冒号“:”。比如原始数据中有这么一行:
例子 web日志是凌乱数据的一个很好例子,下面是一个网站的web日志,数据开始于访问IP,后面有访问日期、访问文件名等信息
现在想要读取访问日期和访问的文件名,但是它们每行中所占据的列的位置都不同,而且文件名的长度每行都不一样,那么SAS读取这种文件通过如下方式:
DATA weblogs:
INFILE 'c:\dogweblogs.txt';
INPUT @'[' AccessDate DATE11. @'GET' File:$20.;
PROC PRINT DATA = weblogs;
TITLE 'Dog Care Web Logs';
RUN;
@’[’作为列指示器,告诉SAS读取[之后的内容,@’GET’告诉SAS读取GET之后的内容,由于文件名作为字符串变量,这里基本都会超过8个字节,因此后面附加:$20
18)跨行观测值的读取方式
一般原始文件中一行代表一个观测值,有时会出现一个观测值跨行的情况。由于SAS会自动转到下一行读取数据,直到读取这个观测的所有变量(input语句中给出),所以你需要告诉SAS什么时候不要换行,以便在日志中不出现SAS-went-to-a-new-line的暂停说明,此时需要在INPUT语句中加行指示器。(????)
行指示器,斜线/:告诉SAS跳至原始数据的第二行;#n:跳至第n行,n代表原始数据中某观测值的行数(#2则让SAS跳至某观测值的第二行),#n不能用来回跳。
例子 有一组关于温度的数据,temperature.dat第一行代表城市和州,第二行代表本日最高温和最低温,第三行代表史上最高温和最低温。
NOME AK
55 44
88 29
用如下的程度来读取这份数据:
DATA highlow;
INFILE 'c:\myrawdata\temperature.dat';
INPUT CITY $ STATE $
/ NormalHigh NormalLow
#3 RecordHigh RecordLow;
PROC PRINT DATA = highlow;
TITLE 'High and Low temperatures for july';
RUN;
Input后面告诉SAS读取第一行的city变量和state变量,斜线/告诉SAS移动到下一行的第一列,以便读取normalhigh和normallow。#3告诉SAS移动到第三行的第一列以便继续读取观测值的recordhigh变量和recordlow变量。这里/可以用#2代替,也可以用/代替#3。
19)当一行出现多个观测值时,可以在input语句结尾加一个停止符号@@
20)读取原始数据的部分观测值
:在SAS读取某一行观测值时,首先读取足够的变量以便决定是否需要保留此行的观测值。然后在input语句结尾加符号@,叫做a trailing at(called a trailing at),这告诉SAS先停在(hold)此行,同时用IF语句检测此观测值是否满足需要,如果是,那么可以再用一个input语句来读取现有的变量
@ vs @@ @的作用类似于@@,都是行停留指示符(line-hold specifiers),不同地方在于停留多久,@能使SAS停留到下一个input语句(也不换行),@@能使停留的时间到下一个data步
2)错误 SAS程序通常将执行的错误标注为醒目的红色字母,你可能忘了分号,拼错了字母,按错了键盘,一个小错误会使得整个程序无法运行。当你看到红色部分多余黑色部分的时候,不要灰心。
3)SAS数据集也被叫做表、观测值也被叫做行、变量也被叫做列
4)字符变量的缺失值用空格表示,数值变量的缺失值用句号(.)表示
5)为变量和数据集命名时要遵守如下规则:
. 名字的长度要小于等于 32 个字节。
. 以字母或下划线开头。
. 可以包含字母、数字、或者是下划线,不能是%$!*@。
. 可以是小写或大写字母,且不区分大小写。
6)SAS程序有两个基本模块:数据步和过程步。
一个典型的SAS程序,由数据步创建SAS数据集开始,再由过程步分析数据。这里有一个例子:数据步中将米转化成千米,过程步中输出结果
DATA step
DATA distance;
Miles = 26.22;
Kilometers = 1.61*Miles;
PROC step
PROC PRINT DATA = distance;
RUN;
数据步和过程步由语句组成(废话),一个过程少至1条语句、多至几百条。新手常犯的错误是将两种过程语句用混,只要记住数据步负责读取、修改数据,过程步负责分析数据、输出报告和效用函数,就不会犯错。
数据步由DATA语句开始:data+数据名。上例中数据步处理了名为distance的数据。为了读取外部数据、未加工的数据,数据步提供了DO LOOPS,IF-THEN/ELSE,以及一些数值和字符函数。数据步也可以按照你想要的方式合并数据集,包括联接(concatenation)和合并(match-merge)。
过程步由proc语句开始:proc+过程名(print、sort、means…),SAS过程步可以处理从数据储存、输出到方差分析、3D图表的一切操作。
典型的程序是以DATA语句开头,输入或修改数据,然后将数据传递给PROC语句。但并不一定非要用这种模式来混合data和proc语句,你可以用任何顺序来排列data和proc两者的顺序,一个程序甚至可以仅有data语句或proc语句。
下面是data语句和proc语句的一些基本不同点:
DATA steps
begin wit DATA statements
read and modifu data
create a SAS data set
PROC steps
begin with PROC statements
perfrom specific analysis or function
produce results or report
7)数据步按照一行一行、一个观测值一个观测值的顺序执行
数据步“一行一行的执行”,这句话很好理解。但很多新手还是容易在这里出错,例如在没有创建一个变量之前就使用它,如果Z变量是X、Y两个变量组合的新变量,那么必须确定创建Z变量的语句在创建X、Y变量语句之后。
而“一个观测值一个观测值的执行”就不是那么容易理解。这意味着SAS先读取一个观测值,然后对这个观测值进行数据步的所有语句(当然也是一行一行的),然后再读取第二个观测值执行。每次执行SAS只有一个观测值。
8)SAS读取的数据的方法主要有以下几种类型:
. 直接输入;
. 从原始数据文件中创建一个SAS数据集(creating SAS data sets from raw data files);
. 将其他软件中的数据文件转换成SAS数据集;
. 直接读取其他软件的数据集;
9)内部原始数据
如果直接将数据输入SAS程序中,那么数据就是SAS内部数据。DATALINES是一个指示,告诉SAS下面跟着是数据行,直到分号结尾,这个分号可以另起一行,也可以接在数据的后面
10)外部原始数据
数据外SAS程序外部时,使用INFILE语句告诉SAS外部数据的文件名和存放路径,它在data语句之后,在INPUT语句之前。INFILE后面的文件名和路径要用引号,各种系统的引用方式各不同:
Windows: INFILE 'C:\Mydir\President.dat';
UNIX: INFILE '/home/mydir/president.dat';
OpenVMS: INFILE '[username.mydir]president.dat';
OS/390 or z /OS INFILE 'MYID.PREDIDEN.DAT';
11)SAS日志
读取外部数据时,SAS日志会给一些很有用的信息,检查这些信息可以解决一些问题,比如对比INFILE语句读取的记录数和数据集中实际观测值,可以确定SAS是否正确的读取了数据
12)过长记录
在一些操作环境中,SAS假定外部数据文件的记录长度为256或更少(记录长度是指某行中的字符数,包括空格),如果长度过长,SAS不能读取全部,此时需要在INFILE语句中使用LRECL=来指定长度,这个长度必须是数据中最长行的长度,如:
INFILE’c:\MyRawData\President.dat’LRECL=2000;
可以通过SAS日志来查看最大记录长度。
13)INPUT语句是数据步的一部分,它告诉SAS如何读取原始数据。使用List input来写input语句:在INPUT关键词之后列出变量名(按照变量在文件中出现的顺序),变量名长度在32个字节(含)以下,只能包含字母、下划线和数据,并必须以字母或者下划线开头。如果变量是字符串,后面要价“$”号,值与值之间至少有一个空格,语句要以分号结束。如: INPUT Name $ Age Height
;
这表明输入三个变量,其中name是字符串,age和height是数值变量
14)column input读取按固定列排列的原始数据
当一些原始数据的值之间没有空格分开,或者没用用句号代替缺失值时,list input就不能用。
但当每个变量的值都出现在数据行的相同位置时,并且变量值是字符串或者标准数值(只包含数据、小数点、正负号、和科学标注的E。逗号和日期都不能算)时,可以使用column input来读取
相比list input,column input有如下优势:
. 不要求变量值之间的空格;
. 缺失值可以直接用空格代替;
. 字符串中可以包含空格;
. 可以跳过不需要的变量。
Column input的input语句格式如下:input关键字后接变量名、再接变量的列位置(列位置是字符或者数值在一行中的位置)。字符串变量名后仍要用“空格+$”,变量名之间仍要用空格隔开。示例如下:
INPUT Name $ 1-10 Age 11-13 Height 14-18;
这个语句表明,Name变量,在行中占据第一列第十列,为字符串变量,age占据第11-13列,为数值变量,height占据第14-18列,数值变量。
15)informats读取非标准格式的原始数据
有时候原始数据不全是字符串或者数值,比如类似1,00,001这样包括逗号的字符串值,电脑就不能读取,其他诸如包含美元符号、十六进制、压缩十进制的数据都是非标准数据。SAS中,informats可以用来告诉电脑如何读取这样的数值。
日期是最普通的非标准数据,SAS informats会把类似10-31-2003或者31OCT03转换成数字,日期的起点为1960年1月1日,即这一天的数字为0。
Informats的三种普遍格式为:字符串、数值、日期。这三种格式的形式如下:
Character $informatw.
Numeric informatw.d
Date informatw.
$是字符串、informats代表形式(比如日期的MMDDYY)、w是宽度、d是小数点的位数、最后是句号".",缺少句号会是的SAS把形式(如MMDDYY)当做变量名。一个简单formatted input的简单INPUT语句如下:
INPUT Name $10. Age 3. Height 5.1 BirthDate MMDDYY10.;
Name 为字符串变量,占据10个宽度,即列位置为1-10;
age为数值变量,占据3个宽度,列位置从11-13;
height为数值变量,占据5个宽度,包括1为小数点和小数点本身,列位置从14-18(如150.3)
最后是日期变量,从第19列开始,形式为MMDDYY
16)混合读取方式
每种数据读取方式都有其优势,list最简单,column和formatted虽然复杂但是不要求变量之间的空格,并且变量名中可以包含变量,而且formatted可以读取特殊的数据比如日期。SAS可以灵活的让你搭配不同的读取方式,以达到最大的方便。
有多种方式进行数据读取,下面额程序是方式之一:
DATA nation;
INFILE 'C:\MYrawdata\park.dat';
INPUT ParkName $ 1-22 STATE $ Year @40 Acreage COMA9.;
PROC PRINT DATA = nation;
TITLE 'Selectes national parks';
RUN;
其中ParkName是column方式读取,State和Year是list方式读取,Acreage是formatted方式读取。
混合读取方式有时会遇到问题:SAS通过一个指示器标注位置,来读取原始数据的一行,但每种读取方式对指示器的使用稍有不同。List方式下,SAS自动找到非空格区域并开始读取;column方式下,SAS读取你所指定的特定位置;informatted方式下,SAS不理会指示器的标准,只是依次的读取。这时,就会需要列指示器@n,来人为的让SAS的读取直接跳至某列。
17)读取凌乱的原始数据
有的数据排列混乱,长度不一。这样的数据需要新的工具处理:@’character’ 列指示器和colon modifier。
@’character’ 列指示器 2.9中提到@column列指示器可以让SAS直接从某列开始读取数据。但有时候你不知道要读取的数据是从哪列开始,此时你只要知道要读取的数据的前面那个字符或单词即可。比如有一个关于狗的原始文件,你想要读取狗的品种号,但文件排列很凌乱,只知道品种号跟随在单词breed后面,那么可以用如下方式读取:Input @’Breed:’ DogBreed $;
colon modifier 由于input读取字符串变量默认为8个字符,因此在上例中如果狗的品种名(dogbreed)超过8个字符,则需要定义长度,定义为$length,在该长度中,空格也算在内。如果要使SAS读取过程中遇到空格则不再继续读取,则要在$length前面加冒号“:”。比如原始数据中有这么一行:
例子 web日志是凌乱数据的一个很好例子,下面是一个网站的web日志,数据开始于访问IP,后面有访问日期、访问文件名等信息
现在想要读取访问日期和访问的文件名,但是它们每行中所占据的列的位置都不同,而且文件名的长度每行都不一样,那么SAS读取这种文件通过如下方式:
DATA weblogs:
INFILE 'c:\dogweblogs.txt';
INPUT @'[' AccessDate DATE11. @'GET' File:$20.;
PROC PRINT DATA = weblogs;
TITLE 'Dog Care Web Logs';
RUN;
@’[’作为列指示器,告诉SAS读取[之后的内容,@’GET’告诉SAS读取GET之后的内容,由于文件名作为字符串变量,这里基本都会超过8个字节,因此后面附加:$20
18)跨行观测值的读取方式
一般原始文件中一行代表一个观测值,有时会出现一个观测值跨行的情况。由于SAS会自动转到下一行读取数据,直到读取这个观测的所有变量(input语句中给出),所以你需要告诉SAS什么时候不要换行,以便在日志中不出现SAS-went-to-a-new-line的暂停说明,此时需要在INPUT语句中加行指示器。(????)
行指示器,斜线/:告诉SAS跳至原始数据的第二行;#n:跳至第n行,n代表原始数据中某观测值的行数(#2则让SAS跳至某观测值的第二行),#n不能用来回跳。
例子 有一组关于温度的数据,temperature.dat第一行代表城市和州,第二行代表本日最高温和最低温,第三行代表史上最高温和最低温。
NOME AK
55 44
88 29
用如下的程度来读取这份数据:
DATA highlow;
INFILE 'c:\myrawdata\temperature.dat';
INPUT CITY $ STATE $
/ NormalHigh NormalLow
#3 RecordHigh RecordLow;
PROC PRINT DATA = highlow;
TITLE 'High and Low temperatures for july';
RUN;
Input后面告诉SAS读取第一行的city变量和state变量,斜线/告诉SAS移动到下一行的第一列,以便读取normalhigh和normallow。#3告诉SAS移动到第三行的第一列以便继续读取观测值的recordhigh变量和recordlow变量。这里/可以用#2代替,也可以用/代替#3。
19)当一行出现多个观测值时,可以在input语句结尾加一个停止符号@@
20)读取原始数据的部分观测值
:在SAS读取某一行观测值时,首先读取足够的变量以便决定是否需要保留此行的观测值。然后在input语句结尾加符号@,叫做a trailing at(called a trailing at),这告诉SAS先停在(hold)此行,同时用IF语句检测此观测值是否满足需要,如果是,那么可以再用一个input语句来读取现有的变量
@ vs @@ @的作用类似于@@,都是行停留指示符(line-hold specifiers),不同地方在于停留多久,@能使SAS停留到下一个input语句(也不换行),@@能使停留的时间到下一个data步
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |