




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
统计软件基础之二SAS的数据获取22图形界面批量式录入关系数据SAS系统提供了将SAS数据集与标准格式文件和用户自定义格式文件之间的互相转换功能。SAS的导入向导可以帮助我们完成这项工作。SAS系统可以转换的标准格式的数据文件包括:MicrosoftExcel97or2000 Lotus1spreadsheetMicrosoftExcel5or7Lotus3spreadsheetMicrosoftExcel4spreadsheet Lotus4spreadsheetMicrosoftAccess2000table DelimitedFileMicrosoftAccess97table (分隔的数据文件没有特定扩展名)DBaseFile CommaSeparatedValuesTabdelimitedFile(逗号分隔数据文件扩展名为csv)(制表符分隔数据文件扩展名为txt)33标准格式的数据文件的转换首先选择File菜单中的Importdata按钮,就启动了导入向导。若文件是标准数据格式,则选择Standarddatasource,然后在下拉菜单选具体格式。44编程方式录入数据采用SAS编程方式录入实际数据是一种灵活而有效的手段。尽管用图形界面进行各种操作已经成为Windows时代的一种主流模式,但在一些较复杂的、庞大的问题上,还是需要用编程模式才能方便的给予解决。在SAS系统中,我们可以用其两类基本过程之一的数据步过程来完成对批量数据的录入与管理。55数据步及基本结构用于将原始数据文件转换成SAS数据集并可进行多种数据变换。数据步均以DATA语句开始,用于创建和处理数据集。DataStep的一般形式:dataSAS-data-set;infile'filename'option;input变量输入设定;其他SAS语句;run;dataSAS-data-set;input变量输入设定;其他SAS语句;cards;原始数据run;66源数据的基本输入模式在SAS数据步中,对输入数据起核心作用的是input语句;根据数据源的格式,input语句可以采用四种基本输入模式:按列输入(Column)格式化输入(Format)自由列表输入(List)命名输入模式(Name)当然,对一些形式较复杂的源数据还可采用混合模式输入。7引例1在回收调查问卷数据时,为了快速录入,常把数据如下组织在文本文件中:7110011160310150110021165422180110302270230130。。。。。。
其中每行是一张问卷的数据,1-2列是区号,1-5列是问卷号,6列是等级码,7列是性别,8-9列是年龄,10列是教育程度,11列是职业代码,12-15列是收入。应如何录进SAS?DATAdiaoch;/*存入diaoch数据集,文件名长度为1~8个字符。*/INPUTid1-5area1-2level6sex7age8-9edc10ocu11sal12-15;LIST;/*显示每行的数据,以便核对。可省之*/CARDS;/*告诉SAS,数据行从下一行开始读之*/110011160310950110021165421980110302270232130run;/*本段程序是典型的按列输入模式录入数据。*/特点:数据字段位置固定88①按列输入模式对数据字段位置固定的源数据,用input语句读入时,可按列模式输入,其一般形式为:
input变量名1[$]开始列数-结束列数[变量名2…];例:
dataindt01; infile'd:\zxd\imptdt01.dat'; inputid$1-4age6-7actlevel$9-12sex$14; run; procprintdata=indt01;run;99按列输入模式示例例:imptdt02.dat中1-7列为日期,8-10列为航班目的地,11-13列为登机人数。试建立SAS数据集。
filenamedst'd:\zxd\sas';/*给文件夹起别名dst*/ datawork.indt02; infiledst(imptdt02.dat); inputdate$1-7dest$8-10boarded11-13; run; datatmp; infiledst(imptdt02.dat); inputdate$1-7dest$8-10boarded11-13year6-7; run; procprint;run;10引例2数据字段位置固定的数据,有时带有定格式,为顺利读取数据,就要正确解读特殊格式。下面就是一批有格式的原始数据:10张三丰77/12/231.68$1,234李斯80/05/162.01$2,200吴留意82/05/161901,800其中每行是一条记录的数据,1-6列是姓名,7-14列是生日,15-18列是身高(米),19列后是薪水。应如何录进SAS?DATAtmp;INPUTname$6.birthdayyymmdd8.height4.2salcomma8.;CARDS;张三丰77/12/231.68$1,234李斯80/05/162.01$2,200吴留意82/05/161901,800run;/*本段程序是典型的格式化输入模式录入数据。*/1111②格式化模式输入对数据字段位置固定的源数据,也可以采用格式化的输入模式更灵活地建立SAS数据集。一般形式:input
指针控制
变量名
输入格式
[…];
常见的指针控制有:
@n——将列指针移到第n列(指示输入的绝对位置) +n——将列指针位置增加n列(指示输入的相对位置)
输入格式是指SAS系统预定义或用户自定义的数据格式,如:4.2、$4.、comma12.2、yymmdd8.适用范围:源文件中各变量所在位置必须是规则的(字段宽度固定);可用指针控制变量读入的始点,终点由输入格式确定;每个变量按输入格式读入指定的长度;该模式特点与列模式基本类似,但可读入多种格式的数值字段。1212输入/输出格式类型SAS数据输入/输出的格式主要有四类:字符型、数值型、日期时间型和用户自定义型。输入输出格式的一般形式为
[$][格式名]w.[d] $ 表明为字符型变量的输入输出格式;
w. 指明格式的宽度为w(字符数).对输入格式就是读入的最大字符数,对输出格式就是变量显示时占据的最大列数;
d 在数值型输出时指明显示小数位数,在数值型变量输入时只指明输入整数值中隐含的小数位数。1313常见的输入/输出格式(一)字符型格式 $w.或$charw.数值输入格式 w.d(若数据中含小数则d无用)数值输出格式 bestw.(w确省值为12,超过宽度w则用科学计数法显示)数值输入格式 commaw.d(可自动除去数据串中的逗号、空格、美圆号、横线,保留数字、小数点)数值输出格式 commaw.ddollarw.d(整数部分每3位加入逗号,后一格式还要再加$于数值前)1414常见的输入/输出格式(二)日期输入格式 yymmddw.mmddyyw.ddmmyyw.日期输出格式 yymmdd[x]w.
其中x指定年、月、日间的分隔符,它是下列字符之一:b(空格)、c(冒号)、d(横线,此为缺省值)、n(无分隔)、p(点号)、s(斜杠)。日期输入输出格式datew.(可转换30MAY2000形式日期)时间输入格式timew.时间输出格式timew.d
实现hh:mm:ss.ss形式时间值与SAS数值的转换。日期时间输入格式datetimew.输出格式datetimew.d
实现ddmmmyyhh:mm:ss.ss形式日期时间值与SAS数值的转换。1515格式化输入示例例:imptdt03.dat中有某科室员工信息,有姓、名、工种、年薪(有逗号的数据)四个字段。dataindt03;infile'd:\zxd\sas\imptdt03.dat';inputLastName$7.@9FistName$5.@15Job3.@19Salarycomma9.;run;procprint;run;1616示例:计算日期间隔datatmp; /*建立数据集tmp*/informatd1d2YYMMDD10.;/*设置变量d1、d2的日期输入格式*/inputd1d2; /*读入变量d1、d2的值*/intd=INTCK("day",d1,d2);/*计算d1、d2日期之间的天数intd*/d3=INTNX("week",d1,10); /*计算d1日期后10个星期时的日期d3*/formatd1-d3YYMMDD8.; /*设置变量d1、d2、d3的日期输出格式*/cards;2001/06/302002/06/30
结果:2001:08:012001-10-01 OBSD1D2INTDD3procprint; 101-06-3002-06-3036501-09-02run; 201-08-0101-10-016101-10-071717获取系统的日期、时间利用date()、time()等函数获取系统日期和时间。例如:dt=date();te=time();利用sysdate、systime系统宏变量获取SAS启动时的日期时间。例如:dd="&sysdate"d;tt="&systime"t;例:
data_null_; a=date();b="&sysdate"d; puta'='b; formatabyymmdds10.; put'a='a'andb='b; put"todayis&sysdate"; run;18引例3有时数据字段位置虽不固定,但字段间的分隔符却是统一的,而数据主要是不带格式的字符型和数值型。下面就是一批这样的原始数据:18张三丰男261.682234李斯女281.71900诸葛留意男331.91800其中每行是一条记录的数据,依次是姓名、性别、年龄、身高(米)、薪水各字段,字段间空格分开。应如何录进SAS?DATAtmp;INPUTname$sex$ageheightsal;CARDS;张三丰男261.682234李斯女281.71900诸葛留意男331.91800run;/*本段程序是典型的列表输入模式录入数据。*/特点:字段顺序固定、字段间的分隔符固定1919③列表模式输入对分隔符(通常为空格)固定的数据源,可以采用自由列表模式输入数据。一般形式为:
input变量名[$][…];/*变量长度默认8,超过会截断*/
其中,变量名指明数据集中要建立的变量,它们出现的顺序必须与数据源中的数据字段顺序匹配。例: datascores; infilecardsdelimiter=','; inputtest1test2test3; cards; 91,87,95 97,.,92 ,1,1 run;
适用范围:源文件中字段间至少有一个空格或特定字符分隔(分隔符固定);dsd选项可处理连续分隔符;字段只能按序输入;
缺失值必须用句点表示;
字符变量的值不能含有空格,长度一般不超过8;2020Infile语句的选项Infile语句是为INPUT语句指定数据源的配套语句,它的一般形式为:INFILE‘数据源’[选项];(数据源为逻辑文件CARDS或DATALINES时,该语句可省略。)常用选项有:
DLM=‘符号’选项:指示数据间的分隔符。
DSD选项:可将数据行中带引号的字符串(包括分隔符)作为一般字符串对待,并且读入该段时会自动除去最外层引号;使用DSD后,缺省的分隔符为逗号;不用DSD,多个相连的分隔符作一个处理;用了DSD后,两个相邻的分隔符就意味中间有个缺失值。
MISSOVER选项:当数据源中的一行记录的数据不够被INPUT语句中的变量读取时,尚未写入的变量都置为缺失值;该选项缺省时自动为FLOWOVER选项,即从数据源的下一行录中取数据填补上。
FIRSTOBS=n1OBS=n2
选项:指示在数据源中读哪些数据行。2121列表模式输入示例源数据文件imptdt04中含性别、年龄、银行卡数、银行卡使用次数、公司卡数、公司卡使用次数6字段数据,均以空格分隔,试建数据集。dataint04;infile'd:\zxd\sas\imptdt04.dat';inputsex$agebankcardfrebankdepcardfredep;run;2222用Length语句设置变量长度一般情况下,变量的长度默认为8个字节,这对字符型变量而言,只能存放8个字符(4个汉字)。length语句可改变变量的长度属性,一般形式为: length变量名表[$]长度.;例: datatmp; lengthname$12.; inputname$age; cards; zhangsanfeng56 lierwa66 wangwujing45 run;2323带格式修饰的列表输入为突破变量的默认长度限制以及解释特殊格式的数据,在列表输入模式中还可以加入输入格式修饰说明,一般形式为:
input变量名:[$]输入格式.[…];例如:imptdt06.dat中城市名超过8字符,两数值字段中有逗号。dataindt06;infile'd:\zxd\sas\imptdt06.dat';inputcity:$12.pop70:comma9.pop80:comma9.;run;procprint;run;24引例4早期留下的数据往往不规则,有时字段前还带有字段名,就像下面这批原始数据:24name=张三丰sex=男age=26sal=223.4sex=女
name=李斯age=28sal=523.6age=33
name=诸葛留意sex=男sal=1260.5应如何录进SAS?DATAtmp;INPUTname=$sex=$age=sal=;CARDS;name=张三丰sex=男age=26sal=223.4sex=女
name=李斯age=28sal=523.6age=33
name=诸葛留意sex=男sal=1260.5run;特点:字段前有“字段名=”标记2525④命名模式输入*
当源数据文件中的数据字段里包含字段名时,往往需要采用命名模式输入较为方便。一般形式为:
INPUT[指针]变量名=[$][...][@|@@];
INPUT变量名=[$]始列[-终列][.小数位][@|@@];
INPUT[指针]变量名=informat.[@|@@];例:datatem; infilecards; inputname=$10.sex=$1.birthday=height=3.; informatbirthdaydate7.;/*此例中birthday=date7.就不行!?*/ formatbirthdayyymmdd10.; cards; name=AlexBrucesex=Mbirthday=13Jun67height=174 birthday=08Aug54sex=Fname=CathyLee run; /*注意:命名模式后面不能再跟其它输入模式*/2626INFORMAT/FORMAT语句一般形式:INFORMAT变量
格式
[…];FORMAT变量
格式
[…];功能:该语句用于设置变量的缺省输入/输出格式。若语句中变量后没指定格式,则表示移去原有的格式。输入格式的具体种类见前面章节。注意:INFORMAT语句不会影响数值变量输入值的实际长度*,但可能会截断字符型变量的输入值长度(见下例)。2727混合模式输入
对一些复杂的非标准的源数据文件,各数据字段需要不同的读入模式才能正确匹配,这时可在input语句中混合使用各种读入模式。例:imptdt07.dat中前11列是社保号,接着7列是开始雇佣日期,20-25列是逗号分隔的年薪,27列开始的字段是部门,最后是电话分机号。Datamixdimpt;Infile'd:\zxd\sas\imptdt07.dat';InputSSN$1-11@12HireDatedate7.@20Salarycomma6.Department:$9.Phone_No;FormatHireDateyymmdd10.SalaryDollar7.;Run;你知道这里用了几种输入模式吗?程序可以改动吗?2828处理数据步的全过程SAS系统执行数据步的过程主要分为两个阶段:•编译数据步
语法检查,代码转换(机器码) 创建输入缓冲区(存放数据源中的一行记录)
创建一个程序数据向量PDV(可暂存数据集的当前一条观测)
创建SAS数据集的描述部分(数据集名称和变量属性等)•执行数据步2929程序数据向量缓冲器PDVPDV(ProgramDataVector)来存放当前的一个观测;观测数据经处理后存入数据集。这是数据步的主要工作场所。 PDV中包括两个自动生成的临时变量:_N_(记录数据步执行的次数)和_ERROR_(错误标志:0为无错误,1为发生错误)数据步中出现的变量(包括数据集内的变量)30DataStep流程3131数据步执行阶段在执行期间,SAS系统执行以下步骤:1)PDV中所有的变量值被初始化为缺失值;2)每个语句被顺序执行;3)INPUT语句把由INFILE语句指定文件的下一条记录读入到PDV;4)其它语句可以修改当前观测;5)PDV中的值被写入SAS数据集;6)程序流程回到数据步的顶部;7)重复以上步骤直到外部文件结束。3232input语句后的单尾符@一个数据步内可以有多条input语句。但是当执行完一条input语句后,一般将放弃缓冲区内现有源数据行,而从源文件中再取一条记录更新缓冲区。若要保持现有源数据行供下一条input使用其数据,则应在input语句的最后加入@跟踪符。例:datatmp1;inputx;inputy;cards;112233445566run;datatmp2;inputx@;inputy;cards;112233445566run;datatmp3;inputx@;inputy@;cards;112233445566run;3333input语句后的双尾符@@一般情况下,当程序执行到数据步底部后,也会从源数据文件中另取一行记录来更新缓冲区内原有数据。若要缓冲区内原有数据不放弃,使其在数据步的下一循环中仍可用,则应在input语句最后加上@@跟踪符。例:datatmp5;inputxy@@;cards;112233445566run;datatmp6;inputxy;cards;112233445566run;datatmp7;inputa@;inputxy@@;cards;112233445566run;datatmp8;inputa@;inputx1-2y@@;if_n_=10thenstop;cards;112233445566run;3434源数据的指针控制当SAS从数据行中读取数据时,它用指针来跟踪当前数据的位置;指针控制符可为input语句指示数据源中当前数据所在的行、列位置。列指针控制符“+n”表示指针右移n列(n为负则左移n列);列指针控制符“@n”表示指针移到第n列(绝对位置);列指针控制符“@‘character-string’”表示把指针移到数据行中字符串character-string后第一个非空格列。行指针控制符“#n”表示指针移到第n行;(当一条观测有几行源数据时,起作用)行指针控制符“#(expression)”表示指针移到表达式的值(必须为整数)所指的行。行指针控制符“/”表示指针移到下一行的第一列。3535指针控制符用法示例行指针用法示例:datatmp1;input#2score1-score2#1name:$10.age/@6score3;cards;zhangsan12889867lisi13779886run;列指针用法示例1:datatmp2;m=-1;/*左移一列*/inputx1-4+my@2id$2.;/*dropm;*/cards;123452468013579run;列指针用法示例2:datatmp3;inputid$2.age3-4@'size='x;list;cards;0116size=54.230215size=45.661318size=61.01run;3636由计算生成变量在数据步中,可以用赋值语句来生成新变量。一般形式为: 变量=表达式;功能:将表达式的计算值赋给变量,若该变量不在数据集中,则新增之。例:输入工号、生日、工资、奖金,计算年龄和总收入。datatmp;inputid$2.@4birthdayyymmdd8.m1m2;age=intck('year',birthday,date());total=(m1+m2)*(1-0.05);cards;0166/07/03598.5012001070/01/23504.671100run;3737数据步内同时建多个数据集利用条件控制语句if与输出语句output配合,可在一个数据步内同时建立多个数据集。例如:利用同一数据源建立两个数据集
datatmp1tmp2; inputname$agescore@@; ifage<=30thenoutputtmp1; elseoutputtmp2; cards;JingJG2889LiM3265WangJ2198LiuB6056procprint;run;3838IF语句及功能一般形式:IF表达式
[THEN语句1;[ELSE语句2]];功能:当表达式为真时,执行语句1,当表达式为假时执行语句2(若无ELSE子句,则执行IF语句之后的其它语句);当任何子句均无,仅剩“IF表达式;”,则表示‘表达式’为‘假’的观测不再处理,也不进入数据集。注意:如果THEN或ELSE后需要一组语句时,可放在“DO;”和“END;”语句之间。IFexpressionTHENDO;
statements;...
END;ELSEDO;
statements;...
END;3939OUTPUT语句及功能(1)功能将PDV中当前的处理观测值(记录)输出到OUTPUT指定的数据集中,该数据集必须已在DATA语句中定义过。注意:一旦在DATA步中出现了OUTPUT语句,则原来在数据步末尾隐含的OUTPUT功能便不再起作用了。(2)用法格式:OUTPUT[数据集名];若省略数据集名,则当前观测值写到本数据步正在建立的数据集。
4040示例生成有4条记录的数据集:datatmp;inputx1-x3@@; y=x1;output; y=x2;output; cards; 123456 procprint; run;求和并统计大于8的输入数据个数:datainfo;inputx@@;retainn0sumx0;ifx<8thengotook;putx;n=n+1;ok:sumx=sumx+x;cards;6313844112procprint;run;4141RETAIN语句和累加语句RETAIN语句功能及用法:RETAIN语句使其中的变量在数据步的每次循环时,不被重新初始化。(有点类似C中的静态变量。)
格式:RETAIN变量名1[初值1][变量2[初值2]…];
或:RETAIN变量名表[(初值表)];累加语句功能及用法:累加语句可对某一数值型变量求累加值。 一般格式:变量+表达式;在第一个观测值未读入前,该变量的初值为零,在数据步的每次循环中重复加入表达式值,若表达式计算结果为缺失值时,将作零处理。4242示例求和与平方和:datatotal;inputx@@;retainsx0sx20;sx=sx+x;sx2=sx2+x*x;cards;254367run;求薪水总数:datatmp; inputname$salary@@; total+salary; cards; Xu800Zhou600procprint;run;4343读层次数据文件用数据步读入的文本数据文件中,有一类称为层次文件,它的记录根据其某个字符段可区分为是记录头或是详细记录。例如,有一数据文件census.dat中,以H开头的行是头记录,其后包含一个地址;以P开始的行是详细记录,记录居住在该地址人员的姓名,年龄和性别。dataPeople(drop=type);infile'D:\census.dat'truncover;retainAddress;inputtype$1.@;iftype='H'theninput@3Address$15.;input@3Name$9.AgeSex$;run;TRUNCOVER选项:如果末端的数据不足相应的变量所指定格式列宽,则从这里截断,读取的部分数据被保留下来,当前变量之后的变量就会置为缺失值。注意和missover(相应变量缺乏数据配对则为缺失值)选项区别。4444SAS函数SAS函数是一个程序,它可以对一个或多个参数进行计算后返回一个值。每个SAS函数有一个关键字名。调用函数应写出函数名和括号内的参数:
函数名(参数,...)(注意:函数的参数可以是常数、变量、函数或表示式)当参数多于一个时,参数之间应该用逗号分隔,也可写成如下形式:
函数名(OF变量1—变量n)
函数名(OF变量1变量2变量3)例如: SUM(OFX1—X100Y1—Y100) SUM(OFXYZ) SUM(X1,X2,X3,X4)4545SAS函数功能测试的小程序测试函数功能的一个简单的程序示例:data_null_;y=sqrt(3);put'y='y;run;上述程序意图了解sqrt(根式)函数的功能、用法。4646常用函数(一)
函数名功能简介函数名功能简介ABS(X)返回X的绝对值ARCOS(x)反余弦MAX(X,Y,...)返回X,Y,...中的最大值ARSIN(x)反正弦MIN(X,Y,...)返回X,Y,...中的最小值COSH(x)双曲余弦MOD(x,y)计算x/y的余数SINH(x)双曲正弦SIGN(x)返回参数x的符号或0PROBBNML(p,n,r)二项式概率分布函数SQRT(x)计算x的平方根PROBCHI(x,df)卡方概率分布函数DIM(array)返回数组中元素个数PROBF(x,ndf,ddf)F分布函数EXP(x)e的x次幂PROBNORM(x)标准正态分布函数LOG(x)计算x的自然对数PROBT(p)T分布函数LOG10(x)计算x的常用对数CINV(p,df,nc)卡方分布分位数DIGAMMA(x)计算Γ函数对数的导数FINV(p,ndf,ddf,nc)F分布分位数COS(x)计算余弦TINV(p,df,nc)T分布分位数4747常用函数(二)SIN(x)计算正弦RANNOR(x)产生一标准正态随机数TAN(x)计算正切RANUNI(x)产生一[0,1]均匀随机数MEAN(x,y,..
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 区块链数据备份光盘驱动器租赁与远程监控服务协议
- 智慧农业无人机精准喷洒系统租赁服务合同
- 高校与知名企业联合培养实习生就业保障协议
- 管理者任职资格答辩
- 《情感调控》课件
- 《聚酰亚胺》课件:一种耐高温高分子材料的深度解析
- 《聚合物X射线研究》课件
- 防火放电安全教育
- 《慢性肾衰竭》课件
- 《咖啡文化基础知识》课件
- 果戈里介绍课件
- 四川省泸州市2025届高三第三次教学质量诊断性考试地理试题(含答案)
- 小学音乐(聆听)小小少年教案设计
- 2025届陕西省高考适应性检测(三)数学试题+答案
- 超市商品补货管理制度
- 2025年阳江海上风电项目可行性研究报告
- 2025新版静疗规范
- 水价与水市场机制联动机制-全面剖析
- 4.1公民基本义务-教案 2024-2025学年统编版道德与法治八年级下册
- 《卫星遥感技术》课件
- 自愿赔偿协议书范本协议书
评论
0/150
提交评论