SAS基础

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

DATA是一个循环,循环的退出(STOP,丢掉当前PDV中的数据)与短路(STOP,ABORT,RETURN)数据步中的PDV数据指针和程序数据矢量(PDV)语句指针数PDV数INPUTvariables11SETdata1data211MARGEdata1data211UPDATEdata1data211SETdata1;SETdata2;21SETdata1;MODIFYdata2;12MODIFYdata1data2;12控制数据指针的变量自动变量说明备注_N_=m指向对应的第m条观测_N_=0表示数据集文件信息POINT=n(variable)指向第n条观测END=variableVariable中保存的是文件结尾标志(逻辑值)NOBS=variableVariable保存数据集的所有观测数编译阶段完成FIRST=m从第m条观测开始读入OBS=n读入的最后一条观测数2.3SAS变量变量命名规则变量的属性:变量的类型字符型:缺失值为空,但仍占1字节的位置数值型:缺失值为“.”,变量的长度字符型:3-8,缺省值8数值型:1-32767字节,依输入时的字符长度而定。输入/输出格式标签最多256字节,命名规则同数据集相同变量列表变量按照它们在PDV中出现的顺序被定义,表示说明X1-xnx1到xnX:字母X打头的变量x--ax到a间(包括x和a)的所有变量x_numeric_ax到a间(包括x和a)的所有数值型变量x_character_ax到a间(包括x和a)的所有字符型变量_numeric_所有数值型变量_character_所有字符型变量_all_所有变量自动变量自动变量说明_N_观测序号_ERROR_错误信息变量_IORC_错误信息变量_NUMERIC_所有数值变量_CHARACTER_所有字符型变量_all_所有变量FIRST.variable同一BY变量(组)内第一个观测LAST.variable同一BY变量(组)内最后一个观测第3章数据获取与数据集操作数据集操作常用语句:DATA/SET/BY/MERGE/UPDATE/MODIFY/PUT/FILE/INFILE3.1数据获取二种方式:直接方式(在SAS系统中用INPUT语句来创建)间接方式(直接获取外部数据:PC格式(如TXT,EXCEL等文件);数据库格式(如DB2,TREADATA等)文件格式访问方式文件格式访问方式TXT(PC)INFILE/IMPORTTERADATA(数据库)LibnamePassthroughodbcCSV(PC)INFILE/IMPORTORACLE(数据库)EXCEL(PC)INFILE/IMPORTDB2(数据库)SPSS(PC)IMPORTSYBASE(数据库)MSACCESS(PC)ACCESS…3.1.1LIBNAME方式1直接访问外部数据库访问SPSS数据库libnamespsspss'F:\Data_Model\Book_data\chapt3';访问DB2数据库libnamehsdbdb2user=xxxxpassword=xxxxdatasrc=datadb;访问Oracle数据库libnameoraliboracleuser=xxxpw=xxxpath=dbmssrvschema=educ;访问TERADATA数据库libnamep_cac_tteradatauser=xxxpassword=xxxdatabase=p_cac_ttdpid=caracaloverride_resp_len=yesdbcommit=0;2通过ODBC访问Step1(window中完成):控制面板/管理工具/ODBC数据源/用户DSN/ACCESS选项(例如)/添加/扩展名为MDB,完成/数据源名(自定义),选择ACCESS数据库(扩展名为mdb)/确定完成Step2(在SAS中完成):libnameodbodbcuser=***password=***datasrc=test;3.1.3IMPORT方式可用实例演示,并保住代码3.1.3INPUT方式自由格式,列表方式,格式化方式,命名方式(形式复杂,但实际中使用较少)3.2SET语句1一般描述格式:SET数据集数据集选项选项语法子项说明数据集一个或多个最多50个数据集数据集选项KEEP=变量(组)DROP=变量(组)RENAME=(旧变量名=新变量名)WHERE=表达式IN=变量FIRSTOBS=常数OBS=常数选项NOBS=变量POINT=变量END=变量KEY=索引名创建新_IORC_,显示最近I/O操作序号,若KEY=值没找到,则返回_ERROR_=1KEY=UNIQUE规定从数据集索引的开关开始搜索2例子:keepdatakeep;setsashelp.class(keep=namesex);run;datad1(keep=name)d2(keep=namesex);/*这是定义处使用*/setsashelp.class(keep=namesex);/*这是调用处使用*/run;renamedatarename;setsashelp.class(keep=namesexrename=(name=name_newsex=sex_new));run;wheredatawhere;setsashelp.class(keep=sexwhere=(sex='M'));run;In的使用dataone;inputxy$@@;cards;1a2b3c;datatwo;inputxz$@@;cards;4d5e;datain1;setone(in=ina)two(in=inb);in_one=ina;in_two=inb;run;firstobsobsdataobs;setsashelp.class(firstobs=3obs=5);run;nobsdatanobs1(keep=total);setsashelp.classnobs=total_obs;total=total_obs;output;stop;/*停止DATA步,相当于退出DATA步的自循环*/run;注:程序在编译时就将数据集class头文件里面的观测数已读入并赋给变量total_obs。datanobs2;if0thensetsashelp.classnobs=total_obs;/*此语并不执行,但编译时已经赋值*/total=total_obs;output;stop;run;point=datapoint1;n=3;setsashelp.classpoint=n;/*注意这种调用方式,只能跟变量,不能跟数值*/output;stop;/*POINT的执行可能达不到文件尾,一定要有退出机制*/run;挑选3,15,4,19号观测datapoint2;don=3,15,4,19;setsashelp.classpoint=n;output;end;stop;run;快取数据集最后一条观测datanobs_point;setsashelp.classnobs=lastpoint=last;output;stop;run;注下面这段程序的效率不如上面的程序Datazhu;Setsashelp.classend=obs_last;Ifobs_last=1;/*数据集要从头读到尾*/Run;End=dataend;setsashelp.classend=last_obs;flag=last_obs;run;两个数据集的合并(要注意差别)dataconcatenat;setsashelp.classsashelp.class(obs=10);/*一个指针,一个PDV,故先读完第一个数据集,然后是第二个数据集,共29条观测*/run;procprint;run;dataconcatenat;setsashelp.class;/*注:读入了第5条观测*/setsashelp.air(obs=4);/*两个SET语句,每个SET语句有各自的指针,但总的只有一个PDV,因此数据集class和数据集air的指针同时运行,结果放到同一个PDV中,故结果只有4条观测*/run;procprint;run;libnamechapt3'f:\data_model\book_data\chapt3';datapercent;if_n_=1thensetchapt3.summary(keep=cargosum);/*这个命令只执行了一次,故其数据指针一直保持不变,因而cargosum值保持不变。从这里也可看出,SET语句里面的指针移动与DATA步的循环有关*/setchapt3.empcount;pctemps=numemps/cargosum;run;3.3BY语句经过排序后,SAS系统的两个自动变量FIRST.variable和LAST.variable很有用databy_data;inputprov$cty$mthincome@@;cards;JSc11100JSc12110JSc13101JSc21200JSc22210JSc23201SHc11500SHc12510SHc13501SHc21400SHc22410SHc234201;run;procsortdata=by_data;byprovctymth;run;datafst_lst;setby_data;byprovctymth;fst_p=first.prov;lst_p=last.prov;fst_c=first.cty;lst_c=last.cty;fst_m=first.mth;lst_m=last.mth;run;3.4MERGE语句实现表的横向合并,可合并:一对一;多对一;或一对多若是多对多合并,需要用SQL过程实现使用的选项中IN=变量使用最多一一合并1)MERGE语句在没有BY语句的情况下,对MERGE后面的数据集实行一对一横向合并,显然,在不同数据集变量名相同的情况下,后面数据集的变量值会覆盖前面的数据集。2)合并结果观测数取MERGE后面所有数据集中具有最大观测数的数据集所对应的观测数匹配合并:要合并的两个数据集均需事先按相同的关键词按相同的排序方式排序,从下面的例子中可以看出其机制:dataa;inputid$xy;datalines;01a2302b3402b4602b5701a7803c88run;datab;inputid$xz;datalines;03c999801a778801a888802b333302b4455run;/*MERGE*/dataab;mergeab;run;procprint;run;注:一个指针一个PDV,没有匹配,一个一个地横向拼接。观测的个数是两个数据集中最大的观测数。procsortdata=a;byid;run;procsortdata=b;byid;run;dataab1;mergeab;byid;run;procprint;run;注:匹配合并时,从结果中可以看出这种合并机制:一一合并如03c;01a为多对多合并,且个数相同;02b仍为多对多,但个数不一样多,从结果看第一个数据集中第3个02b观测值,仍为第二个数据集的最后一个,但并不覆盖第一个数据的变量x的值;dataab12;mergeba;byid;run;procprint;run;/*SET*/dataab2;setab;byid;run;procprint;run;注:按照id值,先第一个数据集,再第二数据集。再到第二个id值3.6MODIFY注:modify语句开辟两个PDV,一个为主数据集,另一个为更新数据集,但只有一个数据指针。主数据集一直处于打开状态。3.6.1访问方式匹配访问Datamaster_data;Modifymaster_datatransaction_data;…;Byvariable;Run;注:若主数据集的BY变量有重复值,则只有第一个出现的观测被更新;若更新数据集的BY变量有重复值,则会反复对主数据集

1 / 31
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功