sas 程序求助

sas 程序求助,第1张

data tmp;

set SASHELPworkers(firstobs=10 obs=15);

if ELECTRIC>260;

run;

proc print;run;

Obs DATE ELECTRIC MASONRY

1 OCT77 2786 2887

2 NOV77 2762 2862

3 DEC77 2746 2767

4 JAN78 2621 2343

输出4条记录。

解法2:

data tmp;

set SASHELPworkers(firstobs=10 obs=15);

where ELECTRIC>260;

run;

proc print;run;

Obs DATE ELECTRIC MASONRY

1 MAY78 2780 2955

2 JUN78 2895 3083

3 JUL78 2966 3069

4 AUG78 3051 3153

5 SEP78 3078 3106

6 OCT78 3082 3163

输出6条记录。

思考:上述两种解法为什么输出不一样?请注意if语句和where语句的区别。

区别:

1 if语句是面向PDV的,对当前PDV中的数据进行判断,满足条件时将其写入到外部数据集;where语句也是面向PDV的,它使用于从外部数据源读数据到PDV之前进行判断,当满足条件时才被写入到PDV。显然一个在写入PDV之前,一个在写入PDV之后,两者是有差异的。

2 当没有数据集选项firstobs=10 obs=15时,if语句和where语句用法结果相同,但有这两个选项时效果就不同了。有这两个选项,if语句是从原数据集(或数据源)的观测记录进行计算个数,即从原数据集的第10号观测开始读入到PDV中,然后再判断是否满足if条件,若满足则输出到外部数据集,直到原数据集的第15号观测结束。而where语句是在读入到PDV之前就进行判断的,所以这里的firstobs的意思是从使得满足where条件的第10个观测开始,而不是原数据集的第10个观测开始。

综上可知,该题中应使用if语句。

SAS循环读取数据CSV是指使用SAS程序来读取CSV文件中的数据。SAS程序可以使用INFILE语句来读取CSV文件中的数据,并且可以使用DO循环来循环读取每一行的数据。此外,SAS还提供了一个特殊的语句叫做INPUT,它可以帮助我们更加灵活地读取CSV文件中的数据。

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步

data s;

do id=1 to 99;

do j=1 to id;

ran=(248-((j-1)2))+(248-((j-1)02))rannor(j);

output;

end;

end;

run;

再套一个循环就好了,

宏程序的循环里面,id是作为宏变量~所以不会显示在数据集里面。

要是连软件的安装和打开都要我啰嗦的话,我劝您还是买一套洪恩的《开天辟地》好好热热身先。

SAS 82的界面中间是三个并排(或层叠)的窗口,那个叫做Program Editor的窗口(窗口标签为Editor)就是用来输入SAS语句的,编程 *** 作的所有内容都是在该窗口内完成的,各位还是要跟它先多熟悉一下。

(一)数据集(dataset)和库

统计学的 *** 作都是针对数据的,SAS中容纳数据的文件称为数据集,数据集又包含在不同的库(暂且理解为数据库吧)中。SAS中的库分为永久性和临时性两种。顾名思义,存在于永久库中的数据集是永久存在的(只要你不去删除它),临时库中的数据集则在你退出SAS后自动被删除。至于SAS中库的概念,最简单的理解就是一个目录,一个存放数据集的目录。

数据集的结构完全等同于我们一般所理解的数据表,由字段和记录所构成,在统计学中我们习惯将字段称为变量,在后面的内容中字段和变量我们就理解为同一种东西吧!建立数据集的方法很多,编程 *** 作中有专门的数据读入方法来建立数据集,但需要将数据现场录入,费时费力。如果数据量大,我劝各位还是先以其它方法将数据集建好,否则程序语句的绝大部分会浪费在数据的输入上。

What are 其它方法?各位是不是去参考一下别的书籍或资料。要不您是不是可以等一等,我准备若干年后出一本SAS *** 作大全。

(二)SAS程序概述

和其它计算机语言一样,SAS语言(称为SCL语言,SAS Component Language)也有其专有的词汇(即关键字)和语法。关键字、名字、特殊字符和运算符等按照语法规则排列组成SAS语句,而执行完整功能的若干个SAS语句就构成了SAS程序。

SAS程序包括多个步骤和一些控制语句,一般情况下均包括数据步和过程步,一个或多个、数据步或过程步,它们之间任何形式的组合均可成为一段SAS程序,只要能完成一个完整的功能。通常情况下SAS程序还包括一些全程语句,用以控制贯穿整个SAS程序的某些选项、变量或程序运行的环境。

SAS程序的语句一般以关键字开始,以一个分号结束,一条语句可占多行(SAS每看到一个分号,就将其以前、上一个分号以后的所有东东当作一条语句来处理,而不管他们处在多少个不同的行中)。SAS语句对字母的大小写不敏感,你可以根据个人习惯决定字母的大写或小写。

1 库名(库标记)的定义

为了保存宝贵的数据和方便 *** 作起见,我习惯于指定自己的库名及其路径(目录),因为SAS系统中已有的永久库(SASUSER)无论库名还是其对应的路径都太过繁琐,使用太不方便。程序中用到的数据,都可以永久的保存于该路径下,保证以后可以重复使用。指定库名的语句为全程语句,其格式如下:

Libname 库名 ‘路径’;

例如我们指定的库名为“a”,路径为:“e:\data\”,SAS语句如下:

libname a ‘e:\data\’;

2 数据步

SAS的数据步以data语句开始,用于创建和处理数据集。Data语句以关键字“data”开始,格式如下:

data 数据集名;

例如:data acase; 将创建在库a中名为case的SAS数据集,语句执行后你可在与库a对应的目录下看到刚刚建立的数据集文件case。

Data语句所指定的数据集,一般都是以“库名数据集名”的格式出现的,也可以单独的“数据集名”出现,此时的数据集系统默认为是临时库中的数据集,退出系统后将会被删除。

data语句有两个重要的功能,标志数据步的开始和命名将要创建的SAS数据集。

除data语句外,数据步一般情况下还包括infile语句、input语句以及datalines语句等。在不同的数据输入方式下对于它们的使用方式也不一样。

SAS程序有两种常见的数据输入方式,即从外部文件读入和直接输入两种方式。

(1)外部文件读入方式

数据若已经包含在某个外部文件(文本文件或数据文件)中,可用此方法输入数据到数据集文件中。

在以上介绍的data语句后,写入以下语句:

infile ‘外部文件的所在位置及名称’ 选项;

input 变量名1变量名2 …变量名n;

infile语句用于从外部文件读入数据,必须出现在input语句之前。它的功能是指定一个包含原始数据的外部文件。

input语句用于向系统表明如何读入每一条数据记录。它的主要功能有:读入由语句指定的数据列,为相应的数据域定义变量名,确定变量的读入模式。

例如:

libname a ‘e:\data\’;

data astudent;

infile ‘e:\data\studenttxt’;

input name height weight;

以上程序将目录“e:\data\”下的文本文件“studenttxt”中的数据输入数据集student中,该数据集存放于目录“e:\data\”下。

(2)直接输入方式

数据量较少或 *** 作者意志力坚强的情况下采用此种输入方式,在data语句之后写入如下语句:

input变量名1变量名2 …变量名n;

datalines;(在以前的版本下为cards,新版本下两者可通用)

… … … …(数据行)

… … … …(数据行)

… … … …(数据行)

;

datalines语句用于直接输入数据,标志着数据块的开始。

注意:这里的数据行中数据之间以空格分隔,当然也可以其它东东如逗号等来分隔,这里大家先以空格来分隔好了。因为不同的分隔方式下input语句要采取相应的控制选项,这些我们以后再讨论,这里我们还是省省力气吧。另外数据行输完后不能像其它语句那样直接在后面加上分号,而要另起一行输入分号,这样SAS才认为这是在输入原始数据而不是在搞别的什么。

例如:

libname a ‘e:\data\’;

data astudent;

input name $ height weight;(name后面的$符号表示变量name为字符型变量)

datalines;

Linda 171 51

Mary 168 50

Selinna 169 49

;

以上程序将直接建立数据集文件student,该数据集文件存放于目录“e:\data\”下。

3 过程步

SAS程序的过程步表示一个处理过程,如排序、T检验、方差分析等等。过程步以关键字proc开始,后面紧跟着过程名,用以区分不同的程序步,并以关键字run结束。

一般的格式如下:

proc 过程名 选项列表;

……(其它语句);

……(其它语句);

run;

SAS程序中涉及的过程多达数百种,实现统计功能时常用的过程也有数十种之多,现将最为常用的过程名称及其所能实现的功能列入下表(表11),以便各位提前热热身。

表11 常用的过程名称及其功能

过程名

功 能

Sort

将指定的数据集按指定变量排序

Print

将数据集中的数据列表输出

tabulate

将数据按照指定的分类变量以表格的形式分类汇总

Means

对指定的数值变量进行简单的统计描述

Freq

对指定的分类变量进行简单的统计描述

Ttest

对指定的变量做t检验

Anova

对指定的变量做方差分析

npar1way

对指定的变量做非参数检验

Reg

对指定的变量做回归分析

Corr

对指定的变量做相关分析

Discrim

对指定的变量做判别分析

Cluster

对指定的变量做聚类分析

Chart

绘出低分辨率的统计图

4 几个常用的重要过程

在进入一般统计学功能实现的内容之前,有关数据预处理和执行重要公共功能的过程大家有必要预先掌握,这里选出几个常用的和重要的过程进行讨论。

(1)对SAS文件进行 *** 作的datasets过程

datasets过程是对数据文件进行管理 *** 作的工具,利用它我们可以实现以下功能:

将SAS文件从一个库中拷入另一个库中;

对SAS文件进行重命名;

修复损坏的SAS文件;

删除SAS文件;

列出某一SAS库中所有的SAS文件;

列出一个SAS数据集的属性,如最后修改时间、数据是否压缩、数据是否索引等;

对SAS文件进行设置密码的 *** 作;

向SAS数据集添加记录;

对SAS数据集的属性以及数据集内变量的属性进行修改;

创建或删除SAS数据集的索引;

创建并管理SAS数据集的核查文件;

创建或删除SAS数据集的完整性规则。

datasets过程的一般格式如下:

proc datasets <选项列表>;

age 当前文件名 相关文件名列表</选项列表>;

append base=数据集名 <data=数据集名 其它选项>;

audit 文件名<( *** 作密码)>; initiate;<其它代码;>

change 旧文件名1=新文件名1 <…旧文件名n=新文件名n> <选项列表>;

contents <data=数据集名> <其它选项>;

copy out=库标记 <其它选项>;

exclude 文件名 <其它选项>;(该语句只能在copy语句后出现,不能和select语句同时出现)

select 文件名 <其它选项>;(该语句只能在copy语句后出现,不能和exclude语句同时出现)

delete 文件名 <其它选项>;

exchange文件名1=交换文件名1 <…文件名n=交换文件名n> <选项列表>;

modify 文件名 <选项列表>;

<modify语句之从属语句>;

repair文件名 <选项列表>;

save文件名 <选项列表>;

run;

是不是太繁琐了,我都有些不耐烦了。不过我还是得写,已经写了嘛!不忍心浪费掉,最起码可以用来充充数,扩大一下篇幅。至于各位,嫌烦的可以略过此部分,想用的时候再来温习也不迟。下面我就不厌其烦地向各位介绍一下各选项及各条语句的含义和用法。

proc datasets语句后各选项的含义及用法见下表(表12)。

表12 proc datasets语句后各选项的含义及用法

选项

含义及用法

alter=转换保护密码

SAS文件设置有转换 *** 作密码时用以验证 *** 作的合法性,密码正确时代码才会被执行

details/nodetails

控制有关SAS文件的详细信息显示与否,前者为显示,后者不显示,默认值为后者

force

此选项具有两个功能:(1)在过程步的语句存在错误时仍然强制程序的执行;(2)在append语句中,两个数据集的变量不完全相同时仍然强制append语句的执行。

gennum=

控制对衍生数据集的处理方式,等号后可为all, hist, revert或某一整数

kill

此选项表示删除待处理的库中的所有文件,应慎用

library=库标记

用以指定所要处理的库

memtype=成员类型

指定处理所针对的库成员类型(文件类型),默认值为all(所有类型)

nolist

在日志文件中禁止对所处理文件目录的显示

nowarn

在语句中指定的文件不存在等情况下,禁止显示出错信息,强制程序继续执行

pw= *** 作密码

SAS文件设置 *** 作密码时验证 *** 作的合法性(包括读、写保护以及转换保护的文件)

read=读保护密码

SAS文件设置读保护密码时验证 *** 作的合法性

age语句用于批量地重命名文件,按照当前文件和相关文件的排列顺序,依次将后一个文件名重命名给前一个文件,结果是最后一个文件被删除,当前文件名被废弃。

对此语句我所了解的就这么多,而且还是通过试验得出的结论,但总感觉还是理解的不对,哪位若有高见还请不吝赐教。

append语句执行向数据集添加记录的功能,选项“base=数据集名”用以指定要添加记录的数据集,“data=数据集名”则指定所要添加的记录所在的数据集,此选项若省略则默认为当前数据集(最近一次 *** 作的数据集)。

audit语句用于对文件的核查,生成核查文件并对其进行管理;change语句以新文件名替换旧文件名;contents语句用于显示指定数据集或当前数据集的各种属性;copy语句用于将当前库中相应的文件拷贝到指定的库中,选项“out=库标记”用来指定文件要拷贝到的目标库;delete语句用于删除指定的文件;exchange语句的功能是将等号前后两个文件的文件名进行互换;modify语句用于修改文件各方面的属性;repair语句用于对指定的文件(受到过某种损坏)进行修复,使其恢复到可以使用的状态;save语句的功能是将其指定的文件保留,当前库中的其他所有文件则被删除。

(2)对数据文件中记录进行排序的sort过程

sort过程的功能是对指定数据集中的记录按照指定的变量进行排序。由于诸多过程有对数据集记录进行排序的需要,比如过程步中存在by语句(用以将数据文件分割为若干部分)的情况下,就需要按照by语句后的变量对数据先行排序,所以sort过程非常有用,而且非常常用。

sort过程的一般格式如下:

proc sort 选项列表;

by <descending> 变量名1 <变量名2 … 变量名n>;

run;

proc sort语句后各选项含义及其用法见下表(表13)。

表13 proc sort语句后各选项含义及其用法

选项

含义及用法

data=数据集名

用以指定sort过程所要处理的数据集,若省略则默认为最近建立或处理的数据集

datecopy

此选项指定在不改变文件创建日期和修改日期的条件下对文件进行排序 *** 作

out=数据集名

将排序后文件以指定的文件名存储,原文件不进行任何修改,若无此选项则将原文件覆盖

sortseq=排序依据

指定对字符型变量排序时依据的标准

reverse/equals/noequals

指定输出数据中的排序方式,三者分别表示将字符变量的次序翻转显示,在排序变量的各水平内部次序保持不变,在排序变量的各水平内部允许次序的改变

nodupkey/noduprecs

指定重复变量的消除方式,前者表示除去排序变量值重复的记录,后者表示除去所有变量值重复的记录

sortsize=

用以指定可用最大内存的大小,等号后为表示内存大小的数值及单位,比如10m

force

用以强制执行重复排序(对已建立索引的文件排序)过程

tagsort

指定在临时文件中仅存储排序变量和记录编号,以减少对磁盘空间的使用

by语句即用以指定排序所要依据的变量,变量可为数值型也可为字符型,其后可指定多个变量,sort过程在按照靠前的变量进行排序的情况下再按照靠后的变量进行排序。by语句中每个变量前可用descending/ascending选项来指定按照其排序的方式(降序或升序),默认状态为升序。

(3)将数据文件输出显示的print过程

print过程的功能是将SAS数据集的记录以一定的方式显示到输出设备(显示屏),可以显示其全部的变量或部分变量。利用此过程,你可以创建从简单列表到可进行数据汇总的各种报告的各种不同的表单。

print过程的一般格式如下:

proc print 选项列表;

by <descending> 变量名1 <变量名2 … 变量名n 其他选项>;

pageby 变量名;

sumby 变量名;

id 变量名;

sum变量名;

var变量名;

run;

proc print语句后可跟的选项含义及其用法见下表(表14)

表14 proc print语句后选项含义及其用法

选项

含义及用法

contents=文本

用以指定html内容文件中指向输出的链接的标识文本,等号后可为任何文本

data=数据集名

指定所要处理的数据集,等号后为数据集文件名

double

指定在相邻的记录间插入一空行

n=字符串

在报告的末尾或by变量各水平分组的末尾显示显示记录的数目,并以等号后的字符串对其进行标识

noobs

禁止记录编号在报告中的显示

obs=列标题

用以指定记录编号所在列的列标题

round

对未进行格式化的数值变量进行四舍五入,统一格式化为带两位小数的十进制数值

rows=page

规定页面格式,目前’page’是此选项唯一可用的值,表示在每一页中只显示一条记录的一行变量值,即一行中显示尽可能多的记录数

width=列宽度

指定列的宽度,可取的值有’full’,’minimum’,’uniform’,’uniformby’等,

heading=方向

取值可为v(vertical)或h(horizontal),表示列标题显示的方向(横向或纵向)

label

指定以变量标识作为相应的列标题,否则以变量名作为列标题

split=字符

首先此选项指定以变量标识作为列标题,以指定的字符作为列标题换行的标志

style=类型元素

指定报告中特定位置所要应用的类型元素(涉及很多内容,详细内容略)

by语句在所有过程中的用法都相同,即将数据集分割为若干小数据集分别进行处理。pageby语句用来控制换页时变量的显示方式,对于其后所指定的变量,相同的值不会显示在不同的页中,该变量某一值的记录在一页的剩余部分显示不下时,则从该值的第一条记录开始换行显示。sumby语句的作用和pageby语句相似,只不过是将换页的动作换为求和,对指定变量的每一值计算var变量的总计值。id语句的作用是用指定的变量值代替记录编号对每一条记录进行标识。sum语句用于指定报告中要进行求和 *** 作的变量,var语句用于指定要在报告中显示的变量。

以上过程作用较为普遍,使用频率较高,有必要预先了解,以便于后面所讨论内容的顺利进行。

为节省篇幅,这里不进行实例演示。内容过于枯燥,可能的错误也难免,还请各位多多包涵。

SAS程序 *** 作的大概情况就草草的这样介绍一下吧,说得太多的话我怕各位没有耐心看下去。更多的内容我想还是留在实际的例子中来介绍,这样大家可以好好的切身体会一下,然后就会印象深刻,实际运用起来也就得心应手了。

Base SAS模块的:

· Data Step(数据步,在SAS帮助文档中称为SAS 语言)

· DS2(Data Step 2,最新一代的编程语言)

· MACRO(宏)

· SQL和FedSQL(虽然只是两个过程步,不能称之为一门语言,但是作为数据处理尤其是数据库处理的编程语言其作用相当重要。)

· FCMP(Function Compiler,用于用户自定义函数和子例程的编译和管理)

· GTL(Graphic Template Language,图形模板语言)

· Metadata Language(元数据管理语言)

SAS/AF模块的:

· SCL(SAS Component Language SAS组件语言,现在已经很少有人用了。)

SAS/OR模块的:

· OPTMODEL(Optimization Model,优化模型编程语言)

SAS/IML模块的:

· IML(矩阵编程语言)

SAS/IML Studio模块的:

· IMLPlus(IML 语言的扩展,主要用于生成图形、调用SAS过程步和非SAS程序)

JMP模块的:

· JSL(JMP Script Language,JMP 脚本语言)

从过来人的经验来看,最好最快的途径就是读牛人的代码,并且逐步运行看结果。比如你随便创建一个数据集,set sashelpclass,就可以运行很多数据步的代码。抛开SAS统计方法层面的各种proc,data步是SAS的精髓。看一个人SAS水平如何通常有两点,一就体现在数据步的使用上,比如看数据步会不会用first,last,set by算累计频数,因为PDV的读取是SAS的核心,如果你还会巧妙使用end= in=等技巧就刚好;二是看会不会写macro,要了解宏变量读取的方式,以及多个&如何转义,个人感觉写宏其实不难,只要你打开options中的macrogen,mprint以及symbolgen等选项,并且知道在macro中可以开放的写%if 以及%do while等,而不必像一般程序一样必须要写在封闭的数据步中就好,这样debug就变得很容易。

以上就是关于sas 程序求助全部的内容,包括:sas 程序求助、sas循环读取数据csv、如何利用the little sas book 学sas等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9674097.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存