第5讲LIBAMNE语句建立一个SAS临时逻辑库和外部库间的联_第1页
第5讲LIBAMNE语句建立一个SAS临时逻辑库和外部库间的联_第2页
第5讲LIBAMNE语句建立一个SAS临时逻辑库和外部库间的联_第3页
第5讲LIBAMNE语句建立一个SAS临时逻辑库和外部库间的联_第4页
第5讲LIBAMNE语句建立一个SAS临时逻辑库和外部库间的联_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第 5 讲LIBAMNE 语句建立一个 SAS 临时逻辑库和外部逻辑库间的联系。LIBAMNE 语句的一般内容是:LIBNAME ,“逻辑库名”, 数据引擎名 和被导入逻辑库地址,“;号”。当读入SAS 的“已定变量数据体”文件时可以不写数据引擎,这时默认数据引擎 V9。“逻辑库名”就是所形成SAS 逻辑库名。例如想把d:winu 中SAS “已定变量数据体”文件examp1 导入 SAS,可用语句 libname ww v9 d:winu;该语句含义是建立 SAS 逻辑库 ww,它和 D 驱文件 winu 库联系,所通过数据引擎是V9。这时如果想把 D:winu 的文件 examp1 导入,

2、SAS 自动通过数据引擎把d:winu 的文件 examp1 联系所谓 SAS 文件 ww.examp1(ww.examp1 是SAS 文件,该文件实体不在SAS 系统,但是通过数据引擎可以在 SAS 内使用),为了 d:winu examp1 不被改变,用SAS 语句 set ww.examp1;就能把 d:winu 文件 examp1 拷为临时文件。例 3.10D 驱上文件wu 中SAS 数据集文件 pdv2,将之存于临时文件 test1。解 可以使用程序libname lib v9 d:wu; /*建立 SAS 逻辑库 lib,数据引擎是 SAS 的 v9,v9 可以省略,被联系的数据库

3、是d:wu */daest1; /*建立临时 SAS 数据集 test1*/set lib.pdv2;/*将“已定变量数据体”文件 d:wu pdv2 拷入 SAS 临时数据集test1 这是名义拷*/proc prrun;daest1;/*数据集 test1 的值打印在输出窗口*/练习题 3 将d:wu 中SAS 的“已定变量数据体”文件 d:wu sastest 导入SAS 形成临时文件test3 并且打印.有时通过数据引擎联系的外部文件太大,变量很多,只想拷出少量变量。但又不能确定数据集中变量的名称和顺序,可以用 CONTENTS 过程的的 VARNUM 选项来查看。下面的代码列出了or

4、acle(甲骨文)数据库中文件 sale 的变量名libname oralib oracle user=myusw=mypwpath=ora_dbms preserve_tab_names=yesconnection=sharedread schema=myschema;/*建立 SAS 与 oracle 数据库联系,SAS 逻辑库名是 oralib,数据引擎是 oracle*/proc contents data=oralib.sale varnum;/*打印 oracle 数据库中文件 sale 的变量名*/ run;练习题 2 用contens 过程求出“已定变量数据体”文件 d:wu

5、sastest 的变量名。3.6 时间变量的输入格式SAS 的一个特点是能够把时间(年月日,时分秒)化为数值。时分秒也可以化为数,常用的是按日化为整数。1960 年 1 月 1 日为 0,也就是说 1959 年 12 月 31 日为-1,之前负的月 2 日为 1。为了让 SAS 知道当你应当按照规定“替换格式”将时间输入:, 1960 年 1表 3-10 常用日期的替换格式输入字符串替换格式日期函数值例 3.11 若儿子和父亲的出生日期是变量 date 的两次观测值,另有两个变量 high,weight 表示出生时身高(厘米)和体重(克),数据如表 3-11。编程算出这两个日子之间有多少天,父

6、子身高和体重的差异。表 3-11 父子出生数据05/13/2015 78 4.2806/22/1980 69 3.88解 考虑到时间是按照月日年顺序排列,可用程序data w;input date:mmddyy10. high weight;/*变量 date 的数据是月,日,年,共占 10 列*/ cards;05/13/2015 78 4.2806/22/198069 3.88;proc pr run;提交后得到Obsdatehighweight1220221747878694.283.88可见 06/22/1980 是 1960 年 1 月 1 日后的 7478 天;05/13/2015

7、 是年 月 日后的天,所以父亲比儿子早出生 12743 天,出生时矮 9 公分,轻 0.4 公斤。另外一种常用的年月输入格式是:月的 3 个字母简写(mon),年(yy)的组合后跟字符宽“7.”,这时没有指名具体时间,SAS 不是以月为 ,而是 SAS 自动以该月的第 1 天作为计算日期。data w;input date:monyy7. x; cards;jun1990 1.5 may2010 2.3;proc prrun;提交程序后得到Obsdatex19jul1984Date9.896619-07-1984ddmmyy10.896607/19/1984mmddyy10.896607-19

8、-1984mmddyy10.89661211109183831.52.3练习题 计算在SAS 系统中公元 1919 年 5 月 4 日对应的数是多少。第 4 章 预处理 SAS 数据集为了更好地分析原始数据,往往需要对原始数据作出预处理,即对原始数据初步加工和整理。例如逐日降雨数据仅需要把某个气象站资料挑出,也可能把某几个站的降雨量加起来,或平均。增加和减少变量(以及相应观测值)都属于数据集的预处理。2 月也有 31 天,要把多余 3 天数据删去。减少观测值也属于数据集的预处理。赋值语句是最常用的增加变量的语句4.1.1 一般赋值语句例 2.2 的 SAS 程序data salary;/* 建

9、立名为 salary 的 SAS 数据集,其内容由以下的SAS 代码补充*/input mingzi$ gonghao jiben gangtie jiangjin ;/*建立变量 mingzi,gonghao,jiben, gangtie,jiangjin;分别表示名字,工号,基本工资,岗位津贴,奖金,mingzi 后跟符号 “$”表示该变量的值是字符串,读入数据时按照 mingzi,gonghao,jiben,gangtie,jiangjin的顺序*/heji=jiben+gangtie+jiangjin;/*赋值语句,建立变量 heji(毛收入),变量 heji =基本工资+岗位津贴+奖

10、金*/if heji1600 then koushui=(heji-1600)*0.2; /*赋值语句,若毛收入大于 1600,建立变量koushui(扣税),变量 koushui 值=heji*0.2*/else koushui=0; /*赋值语句,若毛收入不大于 1600,变量 koushui 值=0*/ shifa=heji-koushui;/*赋值语句,建立变量 shifa(实发),变量 shifa=毛收入-扣税*/datalines;/*以下是数据行*/217 500300 300335 800 400 500442 1000500 800;其中包含以下 4 条赋值语句heji=ji

11、ben+gangtie+jiangjin;/*功能是:建立变量 heji(毛收入),变量 heji =基本工资+岗位津贴+奖金*/if heji1600 then koushui=(heji-1600)*0.2; /*功能是:若毛收入大于 1600,建立变量 koushui(扣税),变量 koushui=heji*0.2*/else koushui=0; /*功能是:若毛收入不大于 1600,建立变量 koushui(扣税),变量 koushui=0*/shifa=heji-koushui;/*功能是:建立变量 shifa(实发),变量 shifa=毛收入-扣税*/第 1 条赋值语句建立变量

12、heli,它表示公司所发各项钱款数;第 2,3 条赋值语句用 if-else 语句建立变量 koushui,它表示每位员工所得税数额,第 4 条赋值语句建立变量 shifa,它表示扣除所得税后实发给职员薪金。这 4 条语句使数据集比原始数据(表 2-1)增加 3 个变量。赋值语句是最常用的 DATA 步语句,使用赋值语句能在 SAS 数据集中增加新的变量,该变量的值一般由原变量的值计算得到,也可以另外赋值(见补充练习题)。赋值语句由变量+等号+表达式组成,如 y=x1+2.5*x2+x3+2.5。这条赋值语句的作用是产生新的变量 y,其每次观察值由相应 x1,x2,x3 观察值计算。直观的说,

13、原有数据体是一个长方形,赋值语句加宽数据体。赋值语句也可以采用替换语句形式,例如某地降雨数据中缺失的数据全用 3 万多的数表示,在计算时应当标明为英文句点。可以用If rainfall30000 then rainfall=.;补充例 3.1 将 rainfall.txt 中大于 30000 的书改为“缺失”。data rain1;input no year month ; do t=1 to 31;input rainfall ;if rainfall30000 then rainfall=.; output;end;datalines;00 327000009 5669191 327002

14、1 3270000 327000 30733413932553 327004 32700157 920003877000 56739 19511018957533235372 156410126 32004137 3200115 3200200045194 3200200 3200300 56748 195110140492323184454700 3270000039000222000000 567511516011230 327004100010032700280348821940 3270011190 3200102000000 3200101000 327000056793 19511

15、024311458001000000001120 005314520003 32700317 327002800000240000 32700 00 32700000000 56985104870286517656651 195110212287752802 3270000 3270000000000 57016 1951100003105500007961200 3270000 327000 57036 195110000 3270042 327000 3200100 57073 1951100000 327007000000000005700000000 57083 1951100000

16、3270070000000000035686100000000005709132700000000000001012115000000000005712771 1334000 320020 32001710 3200100501100000000057206000095 32700000457800 327000 320010070 ; proc pr; run;Data 步赋值语句中不仅可以使用加减乘除,还可以使用多种数学函数,金融函数,随机函数,还可使用时间序列函数。这些函数表在朱世武SAS 编程技术的附录中可以找到。这儿首先介绍时间序列的 1 种函数 dif,时间序列函数 dif(x)是

17、变量 x 每个观测值减去前一观测值的差,它可以在朱世武书的表 A.10 中查到。SAS 介绍多种函数,包括数学函数,金融函数,概率函数(密度和分布函数),随机数函数等。从朱世武书中表 A.4-8 中能很方便地查找,细节可以从“帮助(help)SAS 帮助与文 档 (SAShelpands)SASProductsBaseSASSASLanguagiDictiongaryDictionary of Language ElementaryFunction and Call Routines”中寻找。仅介绍 2 个1 数学函数大小写不分补充例 3.2 画出函数求y=sin(x*2+2)从 0 到 2

18、的值,间隔 0.05;放在临时数据集 w 中,图形,曲线采用青色。解 画图要求出图上点的解 可以采用程序Data w;坐标,就要求出 x 和 y=sin(x*2+2)从 0 到 2 的值04 3270000000000240057006120000003740000131136945 320020Do x=0 to 2 by 0.05;/*x从0到2,步长0.05取值*/ y=sin(2*x*2+2); /*对每一x求出相应y的值*/ output; /*将xy的每一对值输入数据集w*/end;proc pr;run;得到用它可以画图Proc gplot data=w; /*用数据集w的数据体

19、画图*/ Symbol i=join c=cyan; /*点之间直接连接,图形青色*/ plot y*x; /*以y的值为纵坐标,x的值为横坐标*/Run;data w; pi=arcos(-1);do x=0 to 2 by 0.1; y=tan(pi*x); output;end;proc gplot;symbol i=join c=green; plot y*x;run;出现问题:为什么:缺失数据被抛弃,剩下的连接。*/2 随机数是Monte Carlo(随机模拟)的基本工具,(例如模拟黑子,交通)SAS产生的随机数质量特别好,特别是得到随机数序列一般都不循环,即使序列很长;例如容易用

20、SAS 产生长为 1 千万的随机数序列,它不出现循环。SAS 的随机数函数见朱世武表 A.8。例 4.3 给出产生正态随机数的步骤。例 4.3 Monte Carlo 方法需要一个正态分布随机数列,它由 100 个数组成,均值为 3,标准差为 2。用 SAS 产生它。解 产生随机数必须有 1 个“SEED)”,可以是任选的一个 6 位整数。无妨设为 123456。由朱世武表A.8 或 SAS 帮助查到:正态随机函数符号是 NORMAL(seed),它产生标准正态分布 N(0,1),为了使均值为 3,标准差为 2,需要把标准正态随机数乘 2+3.于是可以采用程序如下:data random;/*

21、建立数据集random*/do t=1 to 100; /*作100次循环*/r=normal(123456); /*r是以123456为产生的标准正态随机数*/x=2*r+3; /*x是均值为3,标准差为2的标准正态随机数*/ output; /*将所得t,r,x存入数据集random*/end; /*结束循环*/proc prrun;noobs; /*打印数据集random,不要观测值*/提交程序后得到trx123. 9899100-0.10948-0.348781.120252.781032.302435.240510.35705-1.033881.248123.714110.93223

22、5.49623这 100 个随机数的头是 2.78103,尾巴是 5.49623。用 means 过程可以看出它的均值和方差。Proc means data=random;/*调用 means 过程求均值*/ Var x; /*对变量 x 求均值*/Run;提交给中文SAS9.0 后得到分析变量:xN均值标准偏差最小值最大值1003 07645472 0233739-2 02753147 4784643可见这 100 个数的样本均值是 3.0764547,样本标准差是 2.0233739。取不同值,得到不同随机数系列。练习题 2 生成 Poisson 随机数,长度为 80,均值=6。提示 Po

23、isson 随机数的 Poisson 随机函数为 ranpoi(a,b),其中 a 是seed;b 是Poisson 分布的均值(参数)。可用如下程序。3 SAS/ETS 中可以查到时间系列函数.最常用的是 dif(x),它的值是每次观测减去前一次的值。例 4.1 表 2-2 已给出连续 10 个交易日 3 种价较前一交易日涨跌数。x、y、z 价格。试计算每个交易日股解 计算每个交易日股价较前一交易日涨跌数可以使用函数 DIF(x),它的值等于每个观测值序列中,观测值减去前一观测值的差。建立以下程序data stock;input date$ x y z;/*读入变量 date xyz*/xd

24、if=dif(x);/* xdif 是ydif=dif(y); /* ydif 是zdif=dif(z); /* zdif 是x 比上一工作日上涨的价格*/y 比上一工作日上涨的价格*/ z 比上一工作日上涨的价格*/datalines; /*以下是数据体*/05/705/805/905/1005/1105/1405/1505/1605/1705/18;proc pr run;18.7319.8319.9918.9918.9817.9617.4418.6618.5819.2119.2419.3819.5219.4819.2718.9819.3119.4519.2620.2522.5323.55

25、22.8921.7822.2121.6521.4321.5221.8523.78;则 SAS 数据集 stock 存有 7 个变量的 10 次观测,除了已有的 4 个变量外,又增加变量xdif,ydif,zdif;它们分别是语句打印出 SAS 数据集 stock 如下x,y,z 与上一工作日的差。提交程序,用 proc prObsdatexyzxdif ydif zdif105/718.7319.2422.53.205/819.8319.3823.551.100.141.02905/1718.5819.2621.85-0.08-0.190.331005/1819.2120.2523.780.6

26、30.991.93注意:这儿变量 date 未采用时间变量值的输入格式,因而没有变成整数,而保留字符串形式。xdif,ydif,zdif 就是 3 支的日涨幅。5 月 7 日的股价无法减去前一日的股价,因而该日 xdif,ydif,zdif 的值是空缺的。练习题发现自己儿子身高体重的一些增加多少。使用SAS 代码计算之。如表 4-1,希望知道在相应时间段身高体重平均每天表 4-1儿子身高体重时间身高(cm)体重(kg)1980/01/2554.84.34.2 用 drop 或 keep 语句剔除变量有的时候感到某个 SAS 数据集变量太多,有些变量对于进一步分析和计算没有用处,过多变量会造成麻

27、烦,特别在打印 SAS 时很不方便(SAS 在 output 窗口打印数据时每行最多能打印 256 个字符,每个空格也算 1 个字符,当字符超过 256 时,SAS 就会把一行数据化为多行输出)。为此可以用 drop 或 keep 语句去除那些没有用处的变量(自然也同时删除它们的观测值),仅保留关心的变量。drop 或keep 语句都放在 DATA 步程序前面,但是只在 SAS数据集全部形成后,才最后去除变量。直观的说这两个语句能剪裁 SAS 数据体。DROP 语句的一般形式是“DROP 变量名”。功能是去除DROP 后面所跟随的变量。例如drop x y;功能是从数据集中去除变量 x 和y。

28、 DROP 语句在需要删除的变量个数不多时常用。KEEP 语句的一般形式是“KEEP 变量名;”。功能是保留KEEP 后面所跟随的变量,其它变量一概删去。例如原有变量 X,Y,Z1-Z10,W;则 KEEP x y z2;功能是去除变量 Z1,z3-z10,W;仅保留变量 x,y 和 z2。KEEP 语句在保留的变量不太多,要删去很多变量时常用。例 4.4 在例 4.1 中,SAS 数据集 stock 存有 7 个变量的 10 次观测.如果只想看到每天股价的涨跌数。应当怎样编程?解 可以用用DROP 语句 drop x y z;去掉变量 x y z。采用 keep 语句 keep date x

29、dif ydif zdif;保留变量 date xdif ydif zdif。这样一来就能得到存有 4 个变量的 10 次观测的同样SAS 数据集。即用下列程序data stock;drop x y z;/*或 keep date xdif ydif zdif;*/ input date$ x y z;/*读入变量 date xyz*/xdif=dif(x);/* xdif 是ydif=dif(y); /* ydif 是zdif=dif(z); /* zdif 是x 比上一工作日上涨的价格*/ y 比上一工作日上涨的价格*/z 比上一工作日上涨的价格*/datalines; /*以下是数据体*

30、/05/705/805/905/1005/1105/1405/1505/1605/1705/18;18.7319.8319.9918.9918.9817.9617.4418.6618.5819.2119.2419.3819.5219.4819.2718.9819.3119.4519.2620.2522.5323.5522.8921.7822.2121.6521.4321.5221.8523.78Proc pr;1980-04-0162.16.01981-04-1273.810.21982-03-2885.112.6Run;或data stock;keep date xdif ydif zdif

31、;input date$ x y z;/*读入变量 date xyz*/xdif=dif(x);/* xdif 是ydif=dif(y); /* ydif 是zdif=dif(z); /* zdif 是x 比上一工作日上涨的价格*/ y 比上一工作日上涨的价格*/z 比上一工作日上涨的价格*/datalines; /*以下是数据体*/05/705/805/905/1005/1105/1405/1505/1605/1705/18;18.7319.8319.9918.9918.9817.9617.4418.6618.5819.2119.2419.3819.5219.4819.2718.9819.3

32、119.4519.2620.2522.5323.5522.8921.7822.2121.6521.4321.5221.8523.78Proc pr; Run;打印结果一样4.3 用 SET 语句的obs 和 obs 选项,或 SET 语句配合 IF 语句删减观测行有时希望去除一些观测值,例如 600 多站点降雨数据有 1300 万次观测,不便应用,如何从中找出需要的?就要删去大量数据。通俗的说,删减观测行就是砍去一些数据行。这时可以用 SET 语句的obs=选项和 obs=选项剪切 SAS 数据集。也可用 SET 语句配合添加IF 语句砍去一些数据行。obs=选项和 obs=选项要放在在 SE

33、T 语句的括号内。obs=选项的一般形式是“obs=n”,含义是将所拷贝的 SAS 数据体前 n-1 行删去。obs=选项的一般形式是“obs=m”,含义是将所拷贝的 SAS 数据集第m 行以后的数据行删去。举例说明这些选项的用法例 4.5 设已通过程序data w;input Nou$datalines;xyz;123a bc18.7319.8319.9919.2419.3819.5222.5323.5522.8945678910;d e f g a cd18.9918.9817.9617.4418.6618.5819.2119.4819.2718.9819.3119.4519.2620.2521.7822.2121.6521.4321.5221.8523.78得到 SAS 数据集 W 中有 5 个变量 no,u,x,y,z 的 10 次观测。如果想得到数据集 w1,让它只包含数据集w 的第 3 行以后部分,怎么用SAS 代码实现?解 可用如下程序Data w1;Set w(Run;obs=3);提交程序后打印得到的 SAS 数据集 w1,就得到ObsNouxyz13c19.9919.52

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论