RENAME=(舊變量名-1=新變量名-1 <...舊變量名-n=新變量名-n >)RENAME語句的基本形式如下:
RENAME 舊變量名-1=新變量名-1 <...舊變量名-n=新變量名-n >;其中:
·舊變量名指定在輸入數據集中或當前DATA步中新創建的變量。
·新變量名指定在輸出數據集中使用的變量名或變量名稱列表。新的變量名僅被寫入輸出數據集。
·數據集選項RENAME=或RENAME語句可以修改多個變量的名稱。
將數據集saslib.contact中的變量Name重命名為 Full_Name,並將原有Name中的姓和名分開為Last_Name和 First_Name。下面3段代碼分別在SET語句中使用數據集選項RENAME=、在DATA語句中使用數據集選項RENAME=和使用RENAME語句來實現。代碼1:
data work.contact2_rn;set saslib.contact (rename=(Name=Full_Name));First_Name=scan(Full_Name,1);Last_Name = scan( Full_Name,2);run;
代碼2:
data work.contact2_rn (rename=(Name=Full_Name));set saslib.contact;First_Name=scan(Name,1);Last_Name=scan(Name,2);run;
代碼3:
data work.contact2_rn ;set saslib.contact2;rename Name=Full_Name;First_Name=scan(Name,1);Last_Name=scan(Name,2);run;這3段代碼中都使用了SCAN函數,將原Name變量中用空格隔開的 姓和名提取到變量Last_Name和First_Name中。注意,在引用原Name變 量進行操作時,代碼1使用了新變量名(Full_Name)、代碼2和代碼3使 用了舊變量名(Name)。這是因為在SET語句中使用選項RENAME= 時,SAS為輸入數據集所創建的PDV中的變量名就成為了新變量名,所 以在編程語句中引用原變量時必須使用新的變量名。但是如果在DATA 語句中使用選項RENAME=或RENAME語句,新變量名僅會寫入輸出數 據集,所以在DATA步的其他語句中引用該變量時,必須使用舊的變量名。在SET語句中使用數據集選項RENAME=、在DATA語句中使用數據集選項RENAME=和使用RENAME語句的比較如下:
·RENAME語句不能用於PROC步,但是數據集選項RENAME=可 以。
·數據集選項RENAME=可以對每個輸出數據集的變量單獨更改名 稱,而RENAME語句修改的變量名稱對所有輸出數據集都起作用。
·SET語句中的數據集選項RENAME=會修改變量名,此時,在編程 語句中引用原變量時必須使用新的變量名;如果在輸出數據集中使用 RENAME=選項或使用RENAME語句,在編程語句引用原變量時必須使 用舊的變量名。
在DATA步中出現的變量,如果不屬於輸入數據集的變量,而且也 不是自動變量,SAS則會為其創建新變量,所創建的新變量默認會寫入 輸出數據集。可以通過前面介紹的數據集選項DROP=、KEEP=、DROP 語句、KEEP語句保留或刪除不需要的中間變量。賦值語句是常見的創建新變量的方法,通常將新變量放在賦值語句 的等號(=)左側來創建新變量,並同時給該變量賦值。在前面的例子已經看到了使用賦值語句修改已經存在的變量值和創建新變量。數據集saslib.revenue_quarter中存儲了公司產品今年不同季 度的銷售額,年底要計算全年的總銷售額。下面對各季度的銷售額(Rev_Q1、Rev_Q2、Rev_Q3和Rev_Q4) 相加得到總銷售額Total_Rev,最後使用FORMAT語句修改其輸出格式。data work.revenue;set saslib.revenue_quarter;Total_Rev = Rev_Q1 + Rev_Q2 + Rev_Q3 + Rev_Q4;format Total_Rev DOLLAR10.;run;對數據集進行處理時,經常會需要獲得整個數據集中的所有觀測或 特定一部分觀測中的變量值的總和,例如,公司所有產品的總銷售額、 產品在各地區的總銷售額等。在DATA步中,可使用求和語句、 RETAIN語句、SUM函數等方式對多個觀測中的變量值進行求和。求和語句的基本形式如下:
變量+表達式;
其中:
·變量指定累加變量的名稱,該變量包含一個數字值。
·表達式是任意的SAS表達式。當迭代中表達式的值為缺失值時,SAS會將表達式的求值結果當作0處理。
讀入公司銷售數據建立數據集,並計算總銷售額。公司所有員工銷售數據所在外部數據文件sales.dat的內容如下:
ET001,Kevin Lee,TSG,$10000ED002,Faith May,CSG,$12000ET004,Jackson Cook,TSG,$18000EC002,Hailey Leonard,CSG,$23000ED004,Jack Smith,QSG,$5000
為了讓所生成的數據集中的變量Sales和Total_Sales的輸出格式同輸入格式一樣,在DATA步使用FORMAT語句指定變量Sales和Toal_Sales 的格式為DOLLAR10.。
filename exfiles "c:\sas\data";data saslib.sales;length Name $20;infile exfiles(sales) dsd;input Emp_ID $ Name $ Dept $ Sales:COMMA10.;format Sales DOLLAR10.;run;data work.sales_sum;set saslib.sales;Total_Sales+Sales;format Total_Sales DOLLAR10.;run;proc print data=work.sales_sum noobs;run;前面提到過,SAS會為BY語句中指定的每個變量生成臨時變量 FIRST.變量和LAST.變量。在分組數據中,可以使用這兩組臨時變量計 算每個分組中變量值的總和。data work.shoes_subsidiary ;set sashelp.shoes (keep=Region Subsidiary Sales);by Region Subsidiary;if First.Subsidiary then Total_Sales_Subsidiary=0;Total_Sales_Subsidiary+Sales;if Last.Subsidiary;format Total_Sales_Subsidiary DOLLAR10.;run;
proc print data=work.shoes_subsidiary;run;·在SET語句中,數據集選項KEEP=指定僅讀取輸入數據集中的變量Region、Subsidiary和Sales。
·在BY語句中,指定BY變量Region和Subsidiary。要求SET語句中的 數據集已經按照Region和Subsidiary排序。SAS自動生成臨時變量 First.Region、Last.Region、First.Subsidiary和Last.Subsidiary。其中 First.Region、Last.Region在本例中未用到。
·因為需要計算各附屬品牌的總銷售額,所以每次出現新品牌(First.Subsidiary為1)時將累加變量,並將Total_Sales_Subsidiary置為0。
·求和語句將對Sales值進行累加,結果存儲在Total_Sales_Subsidiary中。
·當Subsidary的值為該分組內最後一個值(Last.Subsidiary為1)時, 才將當前輸出PDV中的觀測輸出,此時Total_Sales_Subsidiary為該品牌 的總銷售額。當前輸出PDV中的變量為Region、Subsidiary、Sales和 Total_Sales_Subsidiary。
·由於輸出觀測中的變量Sales為每個分組內最後一個產品的銷售額,沒有意義,因此在DATA語句中使用數據集選項DROP=指明不將變量Sales寫入輸出數據集work.shoes_subsidiary。
·此外,FORMAT語句在編譯時指定累加變量Total_Sales_Subsidiary的輸出格式為DOLLAR10.。
默認情況下,DATA步中所有變量在每次迭代開始前都會被設置為缺失值。而RETAIN語句中指定的變量則不會,其值會一直保持著,在下次迭代中仍然可以使用。RETAIN語句的基本形式如下:RETAIN 元素列表1 <初始值1|初始值列表1> <...元素列表n<初始n|初始值列表n> >;其中:
·元素列表指定要在歷次迭代中保持其值的變量名、變量列表或數組名。
·初始值或初始值列表為其前面的元素指定的初值(為數字或字 符)。
當指定一個初始值時,該初始值被指定為其前面元素列表中的所 有元素的初值。若指定的是初始值列表(多個初始值),SAS會將該列 表中的第一個值指定給第一個元素,第二個值指定給第二個元素,依此 類推。當未指定初始值或初始值列表時,其前面的元素的初始值為缺失值。基於數據集saslib.sales,使用RETAIN語句和賦值語句計算 公司產品全年總銷售額。示例代碼如下:
data work.sales_retain;set saslib.sales;retain Total_Sales 0;Total_Sales=Total_Sales+Sales;format Total_Sales DOLLAR10.;run;proc print data=work.sales_retain noobs;run;RETAIN語句將Total_Sales的初值設置為0,並告訴SAS在每次迭代 中保持Total_Sales的值。接下來的賦值語句將上次迭代中計算得到的 Total_Sales值與當前觀測中Sales的值相加,結果存儲在Total_Sales中。該例使用的數據saslib.sales中變量Sales沒有缺失值。如果Sales中存 在缺失值,那麼賦值語句中表達式(Total_Sales+Sales)的結果也為缺 失值,這樣會導致當前及其後所有迭代中Total_Sales的值都為缺失值。讀者可在SET語句中使用例3.20中使用的帶缺失值的數據集 saslib.sales2,並查看其生成數據集的內容。當數據值中包含缺失值時, 還可以使用SUM函數對變量求和,該函數只會計算非缺失值的和,具體 的接下來會介紹。
此外,使用RETAIN語句還需要注意的是,如果該變量名僅在RETAIN語句中出現,並且RETAIN語句中未對其賦初值,則該變量不會寫入輸出數據集中。反之,如果RETAIN語句中給出了變量初始值, 即使該變量僅在RETAIN語句中出現,該變量也會寫入輸出數據集。
SUM函數返回非缺失值參數的和。SUM函數的基本形式如下:SUM(參數, 參數...);
該求和語句等效於RETAIN語句和SUM函數的組合。其中,參數指 定為數字常量、數字變量或數字表達式。如果參數中包含缺失值,且所 有參數都是缺失值,則返回缺失值;若任一參數不是缺失值,則返回非 缺失值參數的總和。與求和語句不同,SUM函數不會保持任何變量的 值,所以如果要想保持的變量,應該使用RETAIN語句。基於數據集saslib.sales,計算公司產品全年總銷售額。示例代碼如下:data work.sales_sumfunc; set saslib.sales;retain Total_Sales 0;Total_Sales=sum(Total_Sales,Sales);format Total_Sales DOLLAR10.;run;本次匯總:
1、使用rename對變量重新命名得三種模式
2、利用複製語句創建新的變量 A=x;
3、對數據求和得幾種方式:
變量求和
by語句求和(first.var1 ; last.var1)
retain 語句求和
sum函數求和