加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

sas基础知识学习

(2011-09-14 13:52:00)
标签:

杂谈

sas有两种语句:数据步和过程步。在sas中,通过数据步和过程步来使用sas语言的元素。
数据步:是一组语句组合:从外部文件中读取数据;将数据写入到外部文件中;读取sas数据文件和视图;创建sas数据文件和视图。
过程步:对sas数据集进行分析和产生报表。例如:对数据集进行分析、画图、查询和打印等操作。
逻辑库:由一组sas文件组成。sas软件系统的信息组织有两层,第一层是sas逻辑库,第二层是sas文件。
        sas逻辑库是一个逻辑概念,本事并不是物理实体,它对应的实体是操作系统下一个文件夹或几个文件夹中的一组sas文件。
 sas逻辑库是一组存储在同一目录下被同一引擎访问的文件,其他文件也可以存放在该目录下,但是只有能被sas识别的文件才能显示在逻辑库中。
 
 
 建立sas逻辑库:用libname语句
               libname libref <engine>'sas-data-library'
               其中libref是逻辑库名,sas-data-library是逻辑库对应的物理地址,engine:引擎名称。
               libname resdat 'D:\resdat';--创建逻辑库resdat,对应的物理文件夹为D:\resdat
               libname a ('d:\resbd\','d:\resfin\');--多个文件夹创建一个sas逻辑库
               
临时逻辑库;指它的内容只在启动sas时存在,退出sas时内容完全被删除。系统默认的临时逻辑库为work,引用临时库中的文件时,可以不加库名work。
永久逻辑库:它的内容在sas关闭对话之后仍旧保留,直到再次修改或删除。sas除了work以外的逻辑库都是永久库。引用永久逻辑库的文件时必须加上
            永久逻辑库名。例如:sashelp.Abmfolder

库引擎:是一组规定格式想逻辑库读写文件的内部命令。每个sas逻辑库都对应一个库引擎。
        sas逻辑库引擎是软件的一个元件用来组建sas与sas逻辑库之间的接口。
        
库引擎功能:读取和写入数据;列出库中的文件;删除和重命名文件。

数据集分类:sas数据集有两类:sas数据文件;sas数据视图。
           sas数据文件同时描述信息和存储数据值,而sas数据视图则并不实际上存储数据,实际上sas数据视图就是一个查询语句。
           这个查询语句建立了一个逻辑数据集,每次打开sas数据视图就相当于运行了一次查询语句。
       注意:这两个数据文件在同一级目录或逻辑库下不能同名。

数据集构成:描述信息,数据值。

数据文件:sas数据文件是包含描述信息和数据值的sas数据集。
         普通的sas数据文件:sas格式的数据文件。
         接口数据文件:以其它数据软件格式储存数据的数据文件。
         
sas数据文件和sas数据视图最大区别就数据文件实际储存数值,视图只是包含表的描述信息以及一组用来读取数据的查询语句,并不实际存储数据。
数据文件是静态的,而视图则是动态的;视图每次打开就相当于运行了异常查询语句,只有数据源发生变化,打开试图就会发生变化,而数据文件
                   只有自身被修改时才会发生改变。
                   
sas视图:native view:由数据步或sql过程创建
                interface view:由sas软件创建。

数据步视图:包含用于从多个数据源中读取数据的数据步程序:原始数据文件;sas数据文件;proc sql视图;sas/access视图
     定义格式:data 数据集名称/view=数据集名称;
                ...
                sas语句;
                ....
                run;
        上面的定义中,在data步中的最后一个数据集名称后加上"view=数据集名称",告诉sas程序进行编译,但不运行,而被编译的程序编码则
        储存在view后的数据视图中。
        例如:创建数据步视图:
         data resdat.class1/view=resdat.class1;
         set resdat.class;
         run;
proc sql视图:是一个带有名称的proc sql查询。它可以读写的数据源同数据步视图。
             例如:
                proc sql;
                  create view resdat.e as select * from resdat.class;
                quit;

表词典:是一个包含多个sas系统信息的sas数据视图。下面是一个使用proc sql查询表词典的例子:
proc sql;
    select libname,memname,memtype,nobs from dictionary.tables where libname='CE1';
    quit;
    使用proc sql来查询所需要的表词典,这些表储存在dictionary逻辑库中。
    
输入输出格式:$ 指定为字符格式,如果该项空缺,则默认是数值格式;
              format:规定有效sas输出格式;
              informat:规定有效sas输入格式;
              w:设定输入输出的长度,一般是数据所占的列的数目;
              d:设定数值数据中小数点的位数;

sas系统选项:options option(s);  --option设定一个或多个系统选项。
             options obs=5;  --取数据集的前5个观测(行),obs:observations

sas常数:数值常数;常见的数字:标准格式:1,-1;科学计数法:1.1e11;十六进制格式:1cx,12x,9x;x表示为十六进制
         字符常数:用单引号括起来,如果字符常数内含有引号,引用时,要么它的引号用两个连续的单引号,要么用一个双引号。
         日期时间常数:要使用相应的格式值,格式值带单引号,后面跟一个d(日期),t(时间),dt(日期时间) '01jan00'd;'9:25't,'12jan02:9:27:00'dt
         十六进制字符常数:'533'x,x紧跟在引号部分后面。
         
data;
x='good ';
y='morning';
z=x||y;
put z;
run;

good morning
NOTE: The data set WORK.DATA38 has 1 observations(观测) and 3 variables(变量).
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.00 seconds

sas变量:数值变量,字符变量
         数值变量是以浮点(floating-point)方式存储的数据变量,数值变量包括日期和时间. 数值变量的值只能是数值。
         字符变量名后跟一个美元符($):表示该变量是字符型而不是数值型。
sas变量属性:包括长度,输入输出格式和标签。

创建变量:使用赋值语句;使用input语句;使用format语句或informat语句;使用length语句;使用attrirb语句
          使用赋值语句:如果等号左边的变量不存于数据集中,则赋值语句会产生一个新的变量
          使用input语句:input x $;
          format和informat分别设定变量的输出和输入格式。
                         
变量类型转化:字符自动转化为数值
            data ;
            x=1;
            y='10';
            z=x+y;
            put z;
            run;   
       input函数 :input(数据源,输入格式)将字符转化为数值
           data;
           y=input('5688',$3.);
           put y;
           run;
       数值能自动转化为字符:
             data;
             x='10';
             y=10;
             x=y;
             put x;
             run;
NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
     put函数将数值转化为字符:put(数据源,输出格式):
       data;
       x=3888.00;
       y=put(x,8.3);
       put y;   --结果是 3888.000
       run;        
     
      data;
      x=put('28000.00',$3.);  
      put x;                 --结果是280
      run;
      
      data;
      x=put('280.00',$5.);
      put x;            --结果是 280.0(五位数,包括小数点)
      run;
      
sas自动变量:由数据步语句自动创建的。
             _n_ :观测序号; _error_错误信息变量; _numeric_ 所有数值变量; _character_所有字符变量;
             _all_所有变量; fisrt.variable同一by组第一个观测;last.variable同一by组最后一个观测;
             
             
 日期时间函数:
       data;
      x=date ();
      y=today();
      format x y yymmdd10.;
      put x= y=;
      run;
      结果是x=2004-11-07 y=2004-11-07

data _null_;                         
sdate='01jan2002'd;                  
edate='01jan2003'd;                  
actual=datdif(sdate,edate,'act/act');  --按照每个月的实际天数算
days30=datdif(sdate,edate,'30/360');   --按照每个月30天算
put actual= days30=;                 
run;
结果是:actual=365 days30=360
     
     data;                                             
     n=datetime();         
     put n=;               
     x=datetime();         
     put x=;               
     format x datetime20.4;
     y=datetime();         
     put y=;               
     format y nldatm20.;   
     m=time();             
     put m=;               
     z=time();             
     put z=;               
     format z hhmm8.2;     
     run;
    结果是:n=1415483760.8        
            x=07NOV04:21:56:00.843          
            y=04-11- 7 下午09:56  
            m=78960.843           
            z=21:56.01          
            
         data;                           
         h=hour(datetime()); put h=;    --计算当天时间的小时数
         m=minute(datetime()); put m=;   --计算当天时间的分钟数
         run;                            
           结果是:h=21
                   m=58
                   
   data;                                     
   mdy=mdy(08,18,2001);                       
   put mdy=;                                  
   format mdy yymmdd10.;                      
   hms=hms(21,50,51);                         
   put hms=;                                  
   x=21*60*60+50*60+51;                       
   put x=;                                    
   dhms=dhms(date(),21,50,51);                
   put dhms=;                 
   dhms=dhms(15263,21,50,51);
   put dhms=;                 
   y=15263*24*3600+x;         
   put y=;                    
   run;          
   结果是:mdy=2001-08-18
           hms=78651      
           x=78651        
           dhms=1415483451     
           dhms=1318801851
           y=1318801851  
           
           
import过程步:
           proc import
           datafile="filename"|table="tablename"
           out=sas-data-set
           其中:datafile= 规定要读入外部文件的地址及其名称;table=规定外部数据文件中表名;out=规定要输出的sas数据集;
                 dbms=规定外部数据文件格式的标识名;replace 规定替换已存在文件           
 PROC IMPORT OUT= CE1.DEPT222                    
             DATAFILE= "E:\ce2.xls"              
             DBMS=EXCEL REPLACE;                          
      SHEET="EMP1";                              
      GETNAMES=YES;           
      MIXED=NO;                                  
      SCANTEXT=YES;                              
      USEDATE=YES;                               
      SCANTIME=YES;                              
 RUN;      
 
 libname建立逻辑库和数据库连接:
          libname oralib oracle user=scott password=p path=liutest dbindex=y  --和oracle类型的数据库连接
          取消逻辑库:libname oradb clear;        --oradb是逻辑库名字
          和db2的连接:libname db2lib db2 authid=scott ssid=p;   
          820  libname ce1  clear;                                                 
          NOTE: Libref CE1 has been deassigned.
          
          
数据步读入原始数据:要使用input,datalines和infile语句
                   使用input语句读入原始数据:input语句的5种输入方式:简单方式,列方式,格式化方式,列表方式,命名方式。
                          
           
input的列方式:用来读入严格排列好的标准数据
       data liu1.scores;   --输入到逻辑库liu1的表scores里面                   
       infile datalines truncover;              
       input name $1-10 sex $11 age $12-15;   --行的第1到10列的值为name的输入值,11列为sex的值,12到15列值是age的值
       datalines;                          
       justine   F 12                      
       bob       M 13                      
       run;
 
列表方式;要求input语句按照读入数据的顺序设定变量名称。列表方式下的分隔符默认为空格。
           用列表方式的条件:输入数据值之间至少由一个空格隔开;用小数点表示缺省值。
           :格式修饰符:要对变量值长度不一致的变量规定统一长度就必须用到该格式修饰符。sas默认字符长度8B
          data liu1.blank;
          input univ:$12. plc$ zip;
          cards;
          mit boston 100023
          tsinghuauniv  beijing 100084
          run;     
          如果不对univ归档长度,读入第二条记录时就会只读入tsinghua(8B),就会报错。
         &格式修饰符:字符型输入值可能包含一个或几个空格,如果要读入的数据值本身包含空格时就必须用此格式符。
         data liu1.blank;
         input name & $12. age;
         cards;
         jiang zhu  20             --jiang zhu 数据值本身有空格
         annie zheng  31
         I.altman     60
         run;
       因为&的特性,数据之间应该用两个以上的空格隔开。
       ~格式修饰符:规定读入字符值保留引号,此格式修饰符只能在infile语句于选项dsd一起使用才有效。
       DSD:将默认分隔符改为逗号;如果不加~则自动会把数据中的引号去掉。
       data liu1.blank;
       infile datalines dsd;
       input speakers : $15. title ~$40. location & $10.;
       datalines;
       song, "credit derivatives",room 329 --上面的~格式符会把引号保留
       run;
       
格式化方式: 是input语句读取非标准数据的唯一方法。
             格式化方式输入:
             data;
             infile datalines;
             input (x1-x5) (3*7.2, 2*5.2);
             ...
             n*规定在输入列表中后面的输入格式重复n次;上面前3个变量x1-x3格式为7.2.后两个变量x4-x5格式为5.2
 
              data liu1.blank;
              input x comma9.2;
              datalines;
              $1,000.22         --该数据符号加上数字一共是9列;结果是1000.22
              run;   
            分组格式表:含有两个列表
            input (s1-s5)(4.) 
            input (a b)($,5.) 
            input (name s1-s5)($10. 5*4.)
            
            data liu1.blank;
            input (name score1-score5)($10. 5*4.);
            datalines;
            whittaker 121 114 137 156 142
            smythe    111 97  122 143 127
            run;
              
命名方式输入:如果数据行中有变量的值,后面跟着等号和变量的值,读取数据时应该使用命名输入方式。       
               input date yymmdd10. fullshr  stkcd=$  lstknm=$ ;
               
               
               
数据步文件管理:
   data语句:   data;系统自动规定数据集名datan,  data a; 创建临时数据集a, data resdat.a;创建永久数据集resdat.a
                         data data1 data2;创建两个临时数据集data1和data2, data _null_;特殊名,不创建sas数据集,用于输出
       
            data _null_;
            input (name score1-score5)($10. 5*4.);
            datalines;
            whittaker 121 114 137 156 142
            smythe    111 97  122 143 127
            run;
            
            data data1 data2;  --创建两个临时数据集data1和data2,保存在work逻辑库里
            run;
            
            data _null_;常和put用,用来输出结构,只输出到log窗口,不会产生sas数据集。
  cards语句:cards语句和datalines语句告诉sas系统下面跟着的是数据行
  数据行中有分号时,要用cards4语句或datalines4语句
    data _null_;
    input var1& var2&var3&;
    cards4;
    a;b(;);;
    run;                 
   
 put语句:sas系统的log窗口;sas系统的output窗口;file语句规定的外部文件; 
input用于输入,put用于输出
 by语句;用于规定分组变量,用于控制set、merge、update或modify语句的操作。
 set语句:从一个或多个已存在的sas数据集中读取观测值,并将这些观测值组合在一个数据集中
 file语句;用于规定将要输出的外部文件。
 infile语句:用来定义一个外部数据文件。  
 data语句表示数据步开始。
keep语句:规定输出数据中要保留的变量
drop语句:规定输出数据集中要删除的变量。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有