SAS(八)SAS之DATA步--文件操作語句

SAS(八)DATA步

絕大部分的SAS語句都可分爲兩步:DATA步(打開、編輯、整理數據)和PROC步(分析、處理、顯示數據)組成的,今天我們來學習DATA步相關知識點。

DATA步主要是運用到以下四個類型的語句:

  • 文件操作語句
  • 運行語句
  • 控制語句
  • 信息語句

在學習這種類型語句之前,先學習DATA步的流程

  • DATA語句標誌了數據步開始,並指定了數據步結束時要生成的數據集名字。
  • 每次讀入一行數據,讀入後執行數據步中的其它語句,循環數據步讀取整個數據。
  • _N_變量表示DATA步已經執行的次數
  • _error_變量值爲1時表示程序出錯
data flow;                                                                                                                              
file print;                                                                                                                             
  /*put x= y= z= _n_;*/                                                                                                                 
  input x y;                                                                                                                            
  z=x+y;                                                                                                                                
  put x= y= z=;                                                                                                                         
  put _n_= _error_=;                                                                                                                    
  cards;                                                                                                                                
10 20                                                                                                                                   
100 200                                                                                                                                 
1000 2000                                                                                                                               
;                                                                                                                                       
run;                                                                                                                                    
                                                                                                                                        
proc print data=flow;                                                                                                                   
title ' ';                                                                                                                              
run;

輸出:

 

讀外部數據時,數據步迭代(即每一次)的開始把變量的值置爲缺失值,有幾種情況例外:
1retain語句提到的變量
2sum語句中創建的變量
3、數組_temporary_中的數據元
4fileinfile語句選項中創建的變量
5、自動變量
sas數據集時,只在第一次迭代時把變量值置爲缺失,以後變量保留其值直至新值寫入

 

 

文件操作語句

DATA語句

DATA語句的選項
DROP選項(不列出某些變量)
KEEP
選項(列出某些變量)
LABEL
選項(給數據集加標籤)
RENAME
選項(重命名變量)

 

首先這個是flow的數據集

 

data new1(drop=z);                                                                                                                      
  set flow;                                                                                                                             
run;                                                                                                                                    
data new2(keep=x);                                                                                                                      
  set flow;                                                                                                                             
run;                                                                                                                                    
data new3(label='the new3 dataset');                                                                                                    
  set flow;                                                                                                                             
run;                                                                                                                                    
data new4(rename=(x=xx y=yy));                                                                                                          
  set flow;                                                                                                                             
run;                                                                                                                                    
proc print data=new1;                                                                                                                   
run;                                                                                                                                    
proc print data=new2;                                                                                                                   
run;                                                                                                                                    
proc print data=new3;                                                                                                                   
run;                                                                                                                                    
proc print data=new4;                                                                                                                   
run;

label可以在數據-右鍵屬性看

 

數據集名字:
1data語句後無數據集名字,則自動生成 data1, data2等爲數據集名字,相當於data _data_;
2
data _null_;不產生實際的數據集,只是把內容暫存於內存,以供put語句等讀取結果,可以節約計算機資源
3data _last_;以最近產生的數據集命名並取代其內容。
 

 

Input語句 

分組格式:
input  (g1-g5)  (3*7.2 , 2*5.2);

input  (a  b)  ( $5.)

input  (a  b)  ($ , 5.)

@@-無需分行而按變量連貫讀數據

data;                                                                                                                                   
  input x @@;                                                                                                                           
 cards;                                                                                                                                 
 1 2 3 4                                                                                                                                
 ;                                                                                                                                      
 run;                                                                                                                                   
 proc print;                                                                                                                            
 run;                                                                                                                                   
        

@-固定該數據行;用於需要多個input語句同時讀取一行數據。

data ;                                                                                                                                  
  input type $ @;                                                                                                                       
  if type='c' then input course $ prof $;                                                                                               
  else if type='s' then input name $ id 3.2;                                                                                            
  cards;                                                                                                                                
  c math zxs                                                                                                                            
  s zhao 58888                                                                                                                          
  ;                                                                                                                                     
  proc print;                                                                                                                           
  run;

利用@n   +n    #n 進行指針控制

data inputtest;                                                                                                                         
  input @1 x 5.2  @6 y 2.1 +2 z #2 xx;                                                                                                  
  cards;                                                                                                                                
12345678912345                                                                                                                          
234                                                                                                                                     
;                                                                                                                                       
proc print inputtest;                                                                                                                   
run;
 

 個特殊符號的用法(: & ~)
讀值時第一次遇到分隔符、或是數據行末尾、或是讀滿列數而結束
& 字符型輸入值可以嵌有一個或幾個空格

字符型輸入值保留引號(與infile 語句中選項dsd一起使用纔有效)

                                                                                                                                  
data topics9;                                                                                                                           
  infile datalines dsd;                                                                                                                 
  input speaker :$15. title ~$40. location & $10.;                                                                                      
  datalines;                                                                                                                            
  Whitfield,'Looking at Lift',Blue Room                                                                                                 
  Puentes,"Life After the Revolution",Red Room                                                                                          
  Townsend,"Peace in Our Times",Green Room                                                                                              
  ;                                                                                                                                     
  proc print data=topics9;                                                                                                              
  run;

 

Cards語句

  • Cards語句與datalines語句可以通用
  • 如果輸入數據中含有分號,可用cards4語句或datalines4語句,同時,數據結尾用4個分號表示數據輸入結束
data cardstest;                                                                                                                         
   input number citation $50.;                                                                                                          
   cards4;                                                                                                                              
1 Berry                                                                                                                                 
2  LIN ET AL., 1995; BRADY, 1993                                                                                                        
3  BERG, 1990; ROA, 1994; WILLIAMS, 1992                                                                                                
;;;;                                                                                                                                    
run;                                                                                                                                    
proc print data=cardstest;                                                                                                              
run;

 

Put語句

  • Put語句負責在log窗口輸出一些結果,file print選項可把輸出轉移到output窗口
  • Put _infile_  (輸出最新的數據行到SAS log 窗口)
  • Put _all_  (輸出所有變量的值)
  • Put _page_ (輸出新頁)

 

data;                                                                                                                                   
 /*file print;*/ /* change the output window*/                                                                                          
 put 1230*'SAS學習';                                                                                                                    
 run;                                                                                                                                   
 proc print ;                                                                                                                           
 run;

 

 

File語句

File print  把put語句產生的輸出結果轉移到output窗口

data;                                                                                                                                   
 file print;                                                                                                                            
/* change the output window*/                                                                                                           
 put 1230*'SAS學習';                                                                                                                    
 run;                                                                                                                                   
 proc print ;                                                                                                                           
 run;

 

By語句

  • DATA步中,SAS系統對每個BY組創建兩個臨時變量:
  • First .variable
  • Last .variable
  • 它們用來區別每個BY組的第一個和最後一個觀測

 

Set語句

  • 使用set語句複製數據集
  • Point選項指明要讀入的記錄序號,set 數據集 point=指針變量;可用於抽樣,一般與output語句連用
  • Nobs選項創建一個臨時變量用來存儲數據集的觀測總數
data abc;                                                                                                                               
  set peixun.oranges;                                                                                                                   
run;                                                                                                                                    
proc print;                                                                                                                             
run;

原數據集如下

data zxs;                                                                                                                               
  do n=2 to total;                                                                                                                      
  set sasuser.flow point=n nobs=total;                                                                                                  
  /*if _error_=1 then abort;*/                                                                                                          
  output;                                                                                                                               
  end;                                                                                                                                  
  stop;                                                                                                                                 
  run;                                                                                                                                  
PROC PRINT data=zxs;                                                                                                                    
RUN;

結果輸出:

 

  • Set語句可以串接多個數據集,形式如下

Data 數據集;

    set 數據集A    數據集B   ……;

    <by  變量;>

Run;

  • Rename選項負責改名;in選項產生變量負責記錄觀測來自該數據集;

 

data a;                                                                                                                                 
     input id ming $ sex $ @@;                                                                                                          
         cards;                                                                                                                         
         1 MARY F  3 ANN  F 4 TOM  M                                                                                                    
         ;                                                                                                                              
data b;                                                                                                                                 
     input id name $ sex $ @@;                                                                                                          
     cards;                                                                                                                             
     2 JOSE F 5 ERIE M  6 MAY F 1 MARY M                                                                                                
;                                                                                                                                       
data  result;                                                                                                                           
      set a(rename=(ming=name)) b(in=inb);                                                                                              
          *by id;                                                                                                                       
          if inb=1 then bonus=100;                                                                                                      
run;                                                                                                                                    
proc  print;                                                                                                                            
      title'串接數據集';                                                                                                                
run;

 

 

Merge語句

  • 使用Merge語句並接多個數據集,形式如下

Data 數據集;

merge 數據集數據集2   ……;

by 變量;

run;

 

data person;                                                                                                                            
     input name $ sex $;                                                                                                                
         cards;                                                                                                                         
MARY F                                                                                                                                  
ANN  F                                                                                                                                  
TOM  M                                                                                                                                  
         ;                                                                                                                              
data place;                                                                                                                             
     input name $ city $ region;                                                                                                        
     cards;                                                                                                                             
MARY MIAMI 2                                                                                                                            
ANN TAMPA 6                                                                                                                             
JOSE ERIE 5                                                                                                                             
MARY TAMPA 7                                                                                                                            
;                                                                                                                                       
/*proc sort data=person;                                                                                                                
by name;                                                                                                                                
proc sort data=place;                                                                                                                   
by name;*/                                                                                                                              
data  result;                                                                                                                           
      merge person place;                                                                                                               
      *by name;                                                                                                                         
proc  print;                                                                                                                            
      title'DATA SET RESULT';                                                                                                           
run;

 

Update語句

  • Update語句用一個升級數據集中的觀測來修改一個主數據集。
  • Update語句一定要與BY語句一起使用,BY語句給出了合併觀測時共同變量的名字
  • 主數據集中的共同變量必須是單值的,即不能有兩個或兩個以上的觀測其共同變量值相同
data a;                                                                                                                                 
     input id name $ sex $;                                                                                                             
         cards;                                                                                                                         
         1  zxs   m                                                                                                                     
         2  zjy   m                                                                                                                     
         3  zm    f                                                                                                                     
;                                                                                                                                       
data b ;                                                                                                                                
     input id name $ sex $ sales;                                                                                                       
         cards;                                                                                                                         
         1   zxs   f  34                                                                                                                
;                                                                                                                                       
data c;                                                                                                                                 
     update a b;                                                                                                                        
         by id ;                                                                                                                        
run;                                                                                                                                    
proc print data=c;                                                                                                                      
run;
 
 
 

Infile語句

  • Delimiter (DLM)選項:規定一個字符替代空格作爲分隔符。
  • Firstobs選項 :不是從文件的第一個記錄開始,而是從指定行開始讀取記錄
  • Obs選項:規定用戶想從輸入文件中連續讀取的最後一個記錄號
data new1;                                                                                                                              
  infile cards delimiter=',';                                                                                                           
  input x y z;                                                                                                                          
  cards;                                                                                                                                
1,2,3                                                                                                                                   
4,5,6                                                                                                                                   
;                                                                                                                                       
data new2;                                                                                                                              
  infile cards dlm='ab';                                                                                                                
input x y z;                                                                                                                            
cards;                                                                                                                                  
1aa2ab3                                                                                                                                 
4bb5ba6                                                                                                                                 
7a8b9                                                                                                                                   
;                                                                                                                                       
run;                                                                                                                                    
proc print data=new1;                                                                                                                   
run;                                                                                                                                    
proc print data=new2;                                                                                                                   
run;

 

 

下面這個有點類似分列讀取,第一列讀取兩個字符,第二列讀取三個字符,剩餘第三列

data abc;                                                                                                                               
  infile 'e:\SAS\data\數據處理\column.dat' firstobs=2 obs=3;                                                                            
  input a $9.;                                                                                                                          
run;                                                                                                                                    
proc print;                                                                                                                             
run;
DSD選項:
1、使最外層引號括起的內容當成整個字符串輸入,並去除最外層引號
2、默認分隔符爲逗號
3、兩個相鄰的分隔符意味着前一個分隔符後的字段爲缺失值

 

data;                                                                                                                                   
  infile cards dsd;                                                                                                                     
  input x:$15. y;                                                                                                                       
  cards;                                                                                                                                
"i'm a student",,                                                                                                                       
;                                                                                                                                       
run;                                                                                                                                    
proc print;                                                                                                                             
run;

 

 

  • 當行末尾數據寬度少於規定寬度時

Flowover: 默認選項,將下一條記錄讀入

Missover:將變量置爲缺失

Truncover:將數據直接讀入,不管寬度是否少於規定寬度

Stopover:系統終止數據步執行,報告出錯

 

data;                                                                                                                                   
infile 'e:\SAS\missover.dat';/*flowover missover truncover stopover pad*/                                                               
input x 5.;                                                                                                                             
run;                                                                                                                                    
proc print;                                                                                                                             
run;

這是原始missover.dat的數據 

輸出結果:

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章