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;
輸出:
1、retain語句提到的變量
2、sum語句中創建的變量
3、數組_temporary_中的數據元
4、file和infile語句選項中創建的變量
5、自動變量
文件操作語句
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可以在數據-右鍵屬性看
1、data語句後無數據集名字,則自動生成 data1, data2等爲數據集名字,相當於data _data_;
2、data _null_;不產生實際的數據集,只是把內容暫存於內存,以供put語句等讀取結果,可以節約計算機資源
3、data _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 數據集1 數據集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;
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的數據
輸出結果: