基本格式是矩阵。
用法如下:
要交互运行SAS/IML,只要在程序窗口输入
proc iml;
reset print;
提交此程序,就可以进入交互的SAS/IML运算状态。退出用QUIT语句。
AS/IML是SAS提供的一个可以进行矩阵运算编程的工具。它可以用来进行交互的矩阵运算,也可以编好一个程序再一起运行。程序可以使用分支、循环、模块化子程序等控制结构。数据步中的函数大都能在SAS/IML中使用,SAS/IML 也提供了一些特有的函数。SAS/IML的一个方便之处是它可以直接读取SAS的数据集并把结果写成SAS数据集,它也有存取外部文件的功能。
1)有两种注释方法,一种是号和;号;一种是用/ /表示,注意第二种注释方法不能放在第一列
2)错误 SAS程序通常将执行的错误标注为醒目的红色字母,你可能忘了分号,拼错了字母,按错了键盘,一个小错误会使得整个程序无法运行。当你看到红色部分多余黑色部分的时候,不要灰心。
3)SAS数据集也被叫做表、观测值也被叫做行、变量也被叫做列
4)字符变量的缺失值用空格表示,数值变量的缺失值用句号()表示
5)为变量和数据集命名时要遵守如下规则:
名字的长度要小于等于 32 个字节。
以字母或下划线开头。
可以包含字母、数字、或者是下划线,不能是%$!@。
可以是小写或大写字母,且不区分大小写。
6)SAS程序有两个基本模块:数据步和过程步。
一个典型的SAS程序,由数据步创建SAS数据集开始,再由过程步分析数据。这里有一个例子:数据步中将米转化成千米,过程步中输出结果
DATA step
DATA distance;
Miles = 2622;
Kilometers = 161Miles;
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\Presidentdat';
UNIX: INFILE '/home/mydir/presidentdat';
OpenVMS: INFILE '[usernamemydir]presidentdat';
OS/390 or z /OS INFILE 'MYIDPREDIDENDAT';
11)SAS日志
读取外部数据时,SAS日志会给一些很有用的信息,检查这些信息可以解决一些问题,比如对比INFILE语句读取的记录数和数据集中实际观测值,可以确定SAS是否正确的读取了数据
12)过长记录
在一些 *** 作环境中,SAS假定外部数据文件的记录长度为256或更少(记录长度是指某行中的字符数,包括空格),如果长度过长,SAS不能读取全部,此时需要在INFILE语句中使用LRECL=来指定长度,这个长度必须是数据中最长行的长度,如:
INFILE’c:\MyRawData\Presidentdat’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 informatwd
Date informatw
$是字符串、informats代表形式(比如日期的MMDDYY)、w是宽度、d是小数点的位数、最后是句号"",缺少句号会是的SAS把形式(如MMDDYY)当做变量名。一个简单formatted input的简单INPUT语句如下:
INPUT Name $10 Age 3 Height 51 BirthDate MMDDYY10;
Name 为字符串变量,占据10个宽度,即列位置为1-10;
age为数值变量,占据3个宽度,列位置从11-13;
height为数值变量,占据5个宽度,包括1为小数点和小数点本身,列位置从14-18(如1503)
最后是日期变量,从第19列开始,形式为MMDDYY
16)混合读取方式
每种数据读取方式都有其优势,list最简单,column和formatted虽然复杂但是不要求变量之间的空格,并且变量名中可以包含变量,而且formatted可以读取特殊的数据比如日期。SAS可以灵活的让你搭配不同的读取方式,以达到最大的方便。
有多种方式进行数据读取,下面额程序是方式之一:
DATA nation;
INFILE 'C:\MYrawdata\parkdat';
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’ 列指示器 29中提到@column列指示器可以让SAS直接从某列开始读取数据。但有时候你不知道要读取的数据是从哪列开始,此时你只要知道要读取的数据的前面那个字符或单词即可。比如有一个关于狗的原始文件,你想要读取狗的品种号,但文件排列很凌乱,只知道品种号跟随在单词breed后面,那么可以用如下方式读取:Input @’Breed:’ DogBreed $;
colon modifier 由于input读取字符串变量默认为8个字符,因此在上例中如果狗的品种名(dogbreed)超过8个字符,则需要定义长度,定义为$length,在该长度中,空格也算在内。如果要使SAS读取过程中遇到空格则不再继续读取,则要在$length前面加冒号“:”。比如原始数据中有这么一行:
例子 web日志是凌乱数据的一个很好例子,下面是一个网站的web日志,数据开始于访问IP,后面有访问日期、访问文件名等信息
现在想要读取访问日期和访问的文件名,但是它们每行中所占据的列的位置都不同,而且文件名的长度每行都不一样,那么SAS读取这种文件通过如下方式:
DATA weblogs:
INFILE 'c:\dogweblogstxt';
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不能用来回跳。
例子 有一组关于温度的数据,temperaturedat第一行代表城市和州,第二行代表本日最高温和最低温,第三行代表史上最高温和最低温。
NOME AK
55 44
88 29
用如下的程度来读取这份数据:
DATA highlow;
INFILE 'c:\myrawdata\temperaturedat';
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步
arry是数组语句,现在有一个nut数组,数组有26项数据,数据内容依次为 kcal protein fat avcarbo totalcarbo fibre ash chole va caro retin thin ribof niacin vc totalve ca p k na mg fe mn zn cu se
现在从第一个数据kcal开始 nut(1)=(nut(1)/100)v39(keshibu/100)且知道nut(1)=kcal
所以nut(1)=(kcal/100)v39(keshibu/100) //这个表达式没看懂,可能你自己做一遍就知道了,我不太理解。。。
所有26项数据按 上述 *** 作执行一遍,新生成的nut数组放到three表格里。
注:set newtwo2; 表示读取netwo2这张表。一般来说,这个时候three这张表会填充进netwo2里的内容。但是!!这里的表都没有逻辑库,表示无法理解,你确定这段代码能跑通?不会的再追问吧。
SAS的数据步和过程步以及书写规则
每个SAS程序可以由许多步构成,
一些简单的程序,是由许多完成单个动作的“程序步”和一些设定环境的语句构成的。SAS只有两种程序步:
1 数据步(Data Step):读入源数据文件和SAS数据集,修改、编辑、或创建SAS数据集或文本文件;
2过程步(Proc Step):面向SAS数据集,完成某个特定的计算,分析,和呈现的功能。
每个程序都是由若干语句构成。每个语句是有一个关键词开始,并以分号结束。通常就用开始的关键词命名这个语句。
DATA语句与PROC语句分别标志着数据步和过程步的开始,RUN语句或另一个程序的开始标志着程序的结束。
SAS程序的书写规则:
SAS程序是由SAS语句构成的。每个语句由关键词开始,分号结束。在程序编写时,SAS语句的书写格式比较自由,即:
1语句可在行的任一列开始和结束;
2语句的词之间可以用一个或多个空格符或其它特殊字符隔开。
3一个语句可以分写为多行(换行时,换行符相当于一个空格符)
4多个语句也可以写在同一行。
SAS软件主要是是用于统计分析的工具,应用SAS程序可以采集数据点、建立数据集并分析数据。SAS程序主要分为Data步和Proc步两大类;用Data步创建和加工数据集,用Proc步对数据集进行各类分析。SAS软件同时也是应用于数据库的好软件。
AS语句
SAS语言程序由数据步和过程步组成。数据步用来生成数据集、计算、整理数据,过程步用来对数据进行分析、报告。SAS语言的基本单位是语句,每个SAS语句一般由一个关键字(如DATA,PROC,INPUT,CARDS,BY)开头,包含SAS名字、特殊字符、运算符等,以分号结束。
SAS关键字是用于SAS语句开头的特殊单词,SAS语句除了赋值、累加、注释、空语句以外都以关键字开头。SAS名字在SAS程序中标识各种SAS成分,如变量、数据集、数据库,等等。SAS 名字由1到8个字母、数字、下划线组成,第一个字符必须是字母或下划线。SAS关键字和SAS 名字都不分大小写。
SAS表达式
SAS数据步程序中的计算用表达式完成。表达式把常量、变量、函数调用用运算符、括号连接起来得到一个计算结果。
SAS常量主要有数值型、字符型两种,并且还提供了用于表达日期、时间的数据类型。例如
数值型:12,-75,25E-10
字符型:'Beijing',"Li Ming","李明"
日期型:'13JUL1998'd
时间型:'14:20't
日期时间型:'13JUL1998:14:20:32'dt
filenam语句的作用是,自定义字符来代替某个路径。这个路径可以是文件也可以是文件夹。
例如:
此处加粗的abc代表的就是:D:\Novo\autoexecsas
这个语句很大的作用是为了方便,简化路径。但是有的时候这样使用并不方便,比如我希望使用D:\Novo路径下的autoexec1sas,autoexec2sas等多个文件,那么就必须用filename定义同样数目的路径名。这样的方法并不方便。
故而filename定义的路径名还有另一种使用方法,下面的例子和上面的例子是等效的:
不仅如此,下面的例子也是等效的:
以上就是关于SAS的Iml的基本格式及用法全部的内容,包括:SAS的Iml的基本格式及用法、如何利用the little sas book 学sas、求助一段sas程序是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)