立即注册 登录
公卫人 返回首页

拂衣而去的个人空间 https://www.epiman.cn/?32043 [收藏] [复制] [RSS]

日志

SAS教程:SAS程序初步

热度 3已有 3252 次阅读2010-5-21 20:12 |

从本质上讲,SAS是一种完善的第四代计算机语言。因此要真正掌握它,我们仍然要抛开其华丽的外表,从学习它的核心――SAS程序开始。
  现在,让我们将SAS看成一个计算能力极强的统计学白痴(之所以这样说,是因为它计算能力虽然极强,却只能帮你计算而不能提出自己的实验设计方案或研究方向来),而你有一个非常小的关于数据分析的问题要请它帮忙。自然你要开口提出请求,无论措辞是委婉动听还是直截了当,你的大实话无非是“喂,老兄,我有这样一些数据,我想做这样一种统计分析,您能帮我吗?”。他迅速检查您的要求,在认为合情、合理并且合法后,就开始进行计算,并且在很短的时间内给出计算结果。
  好的,计算机语言就是我们和计算机对话时所用的语言。和以上人类对话的例子相对照,我有这样一些数据”对应SAS程序中的数据步;而“我想做这样一些统计处理”对应SAS程序中的程序步;最后的那一句哀求“您能帮我吗”则对应了Submit命令。在默认情况下,运行结果或者出错信息将自动给出(当然你也可以强制不让它输出)。此外,还有一些系统环境控制语句,如Libnametitle等。SAS程序就是由一个或多个数据步和/或程序步加上一些乱七八糟的环境控制语句组成。在本章中,我们将首先学习SAS对数据的管理方式,然后会了解到什么是数据步和程序步,最后则介绍一下SAS语言中结构化语句的语法。
  §3.1 SAS系统对数据的管理
  在SAS系统中只有SAS数据集才能被SAS过程直接调用,SAS数据集的结构和DBF数据库完全相同,因此无须多讲。而SAS数据集存储在被称为SAS数据库的文件集中,在PC系统中,SAS数据库与某一个文件夹相对应,我们要为每一个数据库指定一个库标记(库名)来识别该库,使用Libname命令可以指定库标记。它的一般格式如下:
  Libname 库标记’文件夹位置’选项;
  例如要指定目录“C\USER”为库标记A,可以在视窗中提交如下语句:
  libname a ’c\user’
  数据库可分为永久库和临时库两种。临时库只有1个,名为WORK,它在每次启动SAS系统后自动生成,关闭SAS时库中的数据集被自动删除;永久库可有多个,用户可以使用Libname语句指定永久库的库标记,永久库中的所有文件都将被保留。但库标记仍是临时的,每次启动SAS系统后都要重新指定。不过为了方便用户,SAS在每次启动时都会自动指定两个库标记:
  SASUSER:指明为永久库,即库中的数据集被保存起来,以便下次启动系统时使用。
  WORK:指明为临时库,对于开发和检查新程序非常有用,但每次SAS运行结束后WORK库中的所有文件将被删除。在程序中引用该库中的数据集可以省略库标记,即它被认为是缺省的数据库。
  SAS数据库对应文件夹,如SASUSER对应c\sas\sasuserWORK对应c\sas\sasworkSAS数据集则对应文件,每个数据集实际上是在硬盘的相应文件夹内产生一个文件名为数据集名,而扩展名为.sd2的文件,因此如果你成功的建立了一个数据集,理论上你就可以反复使用它直到硬盘报废。
  每一个数据集都有一个两级名,第一级是库标记,第二级是数据集名,中间用“.隔开,在程序中通过指定两级名来识别文件。文件两级名的一般形式如下:
  库标记.数据集名
  如在a库中的数据集abc可以这样来引用:aabc
  §3.2 SAS程序的数据步
  3.2.1预备知识
  SAS程序的语句从上一个语句结束处开始,以一个分号结束,可占多行。
  3.2.2数据步
  以DATA语句开始,用于创建和处理数据集。其中最常用的语句有:
  DATA语句它的主要功能是:
  标志数据步的开始。
  命名将要创建的SAS数据集。
  DATA语句的一般形式如下:
  DATA 数据集名;
  INFILE语句用于从外部文件读入数据,必须出现在INPUT语句之前。它的主要功能是:
  确定一个包含原始数据的外部文本文件。
  INFILE语句的格式如下:
  INFILE ’外部文件的所在位置及名称’选项;
  CARDS语句用于直接输入数据,标志着数据块的开始。格式如下:
  CARDS
  数据块
  ;
  INPUT语句用于向系统表明如何读入每一条记录。它的主要功能有:
  读入由语句指定的数据列。
  为相应的数据域定义变量名。
  确定变量的读入模式。
  INPUT语句的格式如下:
  INPUT 变量名 [变量类型起止列数]...;
  方括号表示其中的内容为可选,如果不输入,系统会以默认值代替。
  3.2.3数据的两种输入方式
  上面我们学到了INFILE语句和CARDS语句,它们分别对应了两种数据输入的方式:
  【直接输入方式】
  实际上我们在第一章已经用到了直接输入方式,仍以那个程序为例,其中的数据步如下:
  data temp
  命名将要建立的数据集为worktemp
  input x y@@
  要输入的变量为xy,并且连续输入
  cards
  直接输入数据,数据块开始
  34 56 78 90 35 67 89 10 23 65 77 45
  数据块
  ;
  数据块结束
  变量y后面的@@表示数据可以在一行里连续读入,SAS默认按列来分隔变量,可是这里只有两个变量,输成两列数据太长,因此加上两个@@SAS见到这个符号,在按变量名依次读取完数据后,不是跳到下一行,而是继续在该行读数据,直至本行结束或到达分号为止。
  如果想显示xy两个变量,则将VAR语句改为如下形式即可:
  var x y
  当然,也可以将VAR语句删除,结果相同。
  Where语句如果你想处理的不是整个数据集而只是其中符合某种条件的子集,那么WHERE语句将会非常有用,如上例中我们只想显示大于50x变量的值,则在PRINT过程中加入where语句如下:
  Where x50
  如果条件变为xy两个变量的值都要大于50,则where语句改为:
  50
  SAS语言中常用的逻辑表达符号有and(和)、or(或)、xor(异或)、ne(不等)等。
  By语句如果你需要分组处理数据,例如要按性别分组输出统计结果,你有两种选择,一是用不同的where语句将同一个程序步反复写几遍;另一种显然更酷的方法就是采用by语句。如上例我们想按不同的y值输出x值,则加入by语句如下:
  By y
  使用BY语句要求数据集已经按BY语句中指定的变量排序。如果没有排序,则程序无法正确运行。可以用SORT过程来排序,语法结构如下:
  PROC SORT DATA=数据集名;
  BY 变量名列;
  RUN
  §3.4 结构化语句简介
  每一种结构化语言编写的程序都由顺序、分支、循环三种结构构成,SAS语言也不例外。在这里简要介绍一下分支和循环语句的语法。这些语句均可直接在数据步和程序步中使用,适当地使用它们可以大大简化我们的工作。
  3.4.1分支(条件)语句
  【语法格式】
  语法格式如下:
  IF 条件 THEN
  程序块;
  ELSE
  程序块;
  可见其语法和FOXBASE语言十分相似,只是前面多了THEN,结尾没有ENDIF,可以将两者相比较来理解。其中程序块如果只有一句,则可直接写出,否则应以DO开头,以END结束。
  【应用实例】
  例3.1 在产生数据集temp的同时为其增加变量class,当x50class1,否则class2
  解:程序如下:
  data temp
  数据步开始,定义要建立的数据集为WORK库的TEMP
  input x y@@
  要输入的变量为XY,并且采用数据连续读入方式
  if x50 then class1
  建立新变量CLASS,如果X50,则CLASS1
  else class2
  否则,CLASS2
  cards
  数据块开始
  34 56 78 90 35 67 89 10 23 65 77 45
  数据块
  ;
  数据块结束
  proc print;列表输出数据集中的数据,检查有无错误
  run;程序结束,开始运行以上程序
  以上程序在书写时采用了缩进格式,使程序的结构更清楚。当然大家可以左对齐写完所有的语句,但这样书写的程序在较长时难以阅读。
  为什么可以这样写?在这里有必要解释一下数据步的执行过程,input语句按变量顺序将数据读入内存缓冲区,直至每一个变量都有值相对应。然后数据步继续向下执行,从而其它语句可以修改内存缓冲区,如修改值、增加变量等,在执行到数据步结束后,程序又回到input语句处继续执行,直到数据读完为止。现在再看看这个程序,大家可以理解它了吧!
  3.4.2循环语句
  【语法格式】
  语法格式如下:
  DO 起始条件 TO 终止条件;
  程序块;
  END
  该语句主要用于建立数据集。
  【应用实例】
  例3.2 在产生数据集temp的同时为其增加变量class,取值依次为12
  解:程序如下:
  Data temp;数据步开始,定义要建立的数据集为WORK库的TEMP
  do class 1 to 2;循环开始,循环控制变量为CLASS,取值从12
  input x y@@;要输入的变量为XY,并且采用数据连续读入方式
  output;用OUTPUT语句将循环控制变量写入数据集中
  end;循环结束
  cards;数据块开始
  34 56 78 90 35 67 89 10 23 65 77 45
  数据块
  ;数据块结束
  run;程序结束,开始运行以上程序
  注意在数据步中,我们不需要用语句改变循环变量的大小,系统会自动改变。
  现在,SAS语言的基本知识算是介绍完了。在理论上,你现在可以坐在计算机前,独立编写程序以做出你的统计作业或者是向SAS公司发射核导弹。但为了使你能尽可能地少走弯路(我指的是做统计作业而不是后者),在以后的各章中我们将重点介绍一些常用的程序步,并且在必要的时候介绍一些较为深入的内容

路过

鸡蛋
2

鲜花
1

握手

雷人

全部作者的其他最新日志

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

手机版|会员|至尊|接种|公卫人 ( 沪ICP备06060850号-3 )

GMT+8, 2024-5-4 11:44 , Processed in 0.032710 second(s), 5 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部