數據分析:SAS篇|創建新變量(RENAME、RETAIN、FIRST、LAST、SUM)

2021-02-20 經濟學繪
在對SAS數據集進行處理時,經常需要根據原有變量或變量值生成新變量。根據要實現功能的不同,SAS提供了多種方法,例如通過數據集選項RENAME=(RENAME語句)、賦值語句、求和語句等來實現不 同的功能。在DATA步中,可使用數據集選項RENAME=或RENAME語句修改 一個或多個變量的名稱。跟前面介紹過的數據集選項KEEP=和DROP= 一樣,數據集選項RENAME=也可用於DATA語句中的輸出數據集和 SET語句中輸入數據集。其基本形式如下:
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函數求和

相關焦點

  • SAS實現批量計算字符型變量的IV值
    WOE和IV的使用及計算方式,本篇文章著重介紹下批量對sas數據集中字符型變量求解IV,註:字符型變量不需進行處理。創建creditcard數據集:options mlogic mprint;%let dir=C:\Users\toshiba\Desktop\放一些文檔\ScorecardDev\Examples;%include "&dir\CC_Dataset.sas";批量計算字符型變量的IV值:%macro iv_char();
  • 使用pandas做數據分析,掌握這些函數就夠了
    >P21 減少dataframe佔用內存P24 創建虛擬變量(one-hot編碼)P25 時間欄位處理P26 去除重複項P27 怎樣避免SettingWithCopyWarmingP28 改變顯示選項P29 創建Dateframe的方式
  • 匯總|SAS編程及應用中的技巧和方法
    sas數據整理常用小技巧:1、修改屬性 attrib2、根據條件刪除記錄
  • 【SAS Says】基礎篇:1. SAS軟體入門
    開發數據(一)6. 開發數據(二) 7. SAS宏初步8. 相關、回歸等基本統計您可以在微信公眾號「數說工作室」(微信ID:shushuojun)中回復「sasbase」查看。SAS命名規則 為你的變量和數據集命名,使它們容易被辨別。A,B,C這樣的名字可能看起來很完美,寫程序的時候也很方便,但當你6個月後再使用這些數據時,你會發現name,height,weight這樣的名字更有用。
  • 【SAS Says】基礎篇:讀取數據(下)
    Proc import會瀏覽你的數據文件,自動決定變量類型(字符串或數值),為字符串變量分配正確的長度,辨認出日期變量。Proc import會將兩個連續的分隔符視為缺失值,會讀取引號中的變量值。一行讀完後,會自動分配缺失值給未賦值的變量。
  • 從程式設計師到數據科學家:SAS 編程基礎 (5)- 邏輯庫與數據集
    操縱數據是數據學家的重要工作內容之一,主要用來為數據分析或創建報表準備必要的內容。傳統數據倉庫領域的數據工作(ETL或ETCL)——數據的抽取(Extract)、轉換(Transformation)、清洗(Clean)和加載(Load)都是數據科學家的家常便飯。
  • Logistic回歸分析-分類因變量最常用且首先考慮的分析方法
    一、重要概念一)基本表達式 當因變量為分類變量時,最常用且首先考慮的回歸分析方法應為logistics回歸,也稱為logit回歸,因logistic回歸模型表達式為,由表達式可知logit P與變量間存在線性關係,P/(1-P)稱為發生比(odds)即觀測事件發生的概率與未發生的概率的比值。
  • Python、R、Java、SAS 數據分析效率的簡要對比
    於是就有了這篇文章,利用 Python、R、Java 和 SAS 對同一份數據進行相同的處理,看看四種語言的表現如何。我也就當複習 Java 和 SAS 了。數據處理需求:將 Gross Export(出口額)和 Share(出口佔比)數據按 Sector(類別)加總將 2009-2018 年的 Gross Export 和 Share 分別匯總,生成兩張新表根據得到的匯總數據,繪製必要的圖像,比如折線圖判斷趨勢不是太複雜的需求,如果只有一個文件的話,甚至可以直接用
  • 技巧|SAS常見實用技巧大匯總
    x1-x5,可以調用missing(of x1-x5).此種寫法也可用於諸如sum等函數。導出到數據集後,可以進行更進一步的分析。在對符合已知變量條件的記錄進行處理時,果斷先進行篩選,然後在進行處理。同時在 Data步建立新數據集,在進行的條件篩選中,where的效率比if高,因為where在讀入的時候就已經進行判斷,而if則是等到全部讀完的時候才進行判斷。如需對class數據集中的男生建立一個新變量weight_new,以下這種寫法是不可取的。
  • 【SAS Says】基礎篇:SAS軟體入門(下)
    ② 是原始的SAS程序語句③ 說明了數據步為你創建的數據集名稱,觀測值數和變量數。它可以幫助你確認你的程序沒有丟失觀測值,也沒有創建你不需要的變量。④ 這部分顯示了數據步和過程步佔用的電腦資源。當你使用的是多用戶系統,或者處理大型數據而使得SAS運行佔用大量時間時,這部分信息可以幫助你檢查哪一步比較耗時。
  • 強大的dplyr包實現數據預處理
    工作中的數據分析或挖掘任務都需要進行各種各樣的數據預處理,包括數據整合、關聯、排序、篩選等。
  • SAS大學版 - for SAS Learner
    使用 SAS Studio可訪問數據文件、邏輯庫和現有程序,並編寫新的程序,也可使用 SAS Studio 中預定義的任務來生成 SAS 代碼。Base SAS:  是SAS大學版的基礎組件,通過SAS程式語言,可以進行數據抽取、數據轉化清洗、數據分析、報告展現和信息交付等。
  • 使用pandas分析1976年至2010年的美國大選的投票數據
    我將使用pandas庫進行數據分析和可視化,因此這也是使用pandas的函數和方法的良好實踐。讓我們從導入庫並將數據集讀入一個Pandas dataframe開始。因此,下面的代碼將創建一個dataframe,其中包含每個州對於每次選舉的總票數。
  • 30 個函數,加速你的數據分析處理速度!
    它提供了許多功能和方法,可以加快「數據分析」和「預處理」步驟。為了更好的學習 Python,我將以客戶流失數據集為例,分享 「30」 個在數據分析過程中最常使用的函數和方法,數據「文末」可以下載。通過將 isna 與 sum 函數一起使用,我們可以看到每列中缺失值的數量。
  • 鞏固SQL - 窗口函數&變量&數據透視圖
    做分析。(工作寫的是hive,為方便演示,本文章均使用Mysql8.0.16版本)一、窗口函數1、什麼是窗口函數窗口函數,也叫OLAP函數(Online Anallytical Processing,聯機分析處理),可以對資料庫數據進行實時分析處理。
  • Stata生存分析:stset命令詳解
    今天,我們就和大家分享一下如何處理生存分析數據結構以及 stset 命令各種選項的使用。 1. 生存分析數據結構處理生存分析數據結構既可以用截面數據,也可以用面板數據。本推文中以因變量為初婚風險為例給大家示範截面數據與面板數據分別應該如何處理。
  • 數據分析工具篇——for循環運算優化(一)
    作者:livan來源:數據python與算法這一系列《數據分析工具篇》的開篇,也是數據分析流程中開始和結束的動作,數據導入之後,緊接著需要做的就是對數據的處理,我們會花費幾篇的時間,來和大家聊一下常用的處理邏輯和常見的幾個包,在數據處理過程中,常用的處理邏輯主要有:for循環優化、廣播應用方案
  • 分享|我是一名SAS程式設計師(一)
    分類數據中的缺失值和0意義很不同如果某個分類變量的值為缺失值,這說明這個值的結果是不知道的,這條觀測不會納入分析人群和分母的計算;而如果它的值是0,這說明結果是已知的,此時0會對應一個相應的臨床意義,同時納入分析和分母人數的計算。比如說:考察療後病人對藥物的有效反應率。
  • SAS-PROC UNIVARIATE相關用法
    pctlpts=2.5,5,25,50,75,95,97.5 pctlpre=per max=MAX NORMALTEST=NORMALTEST PROBN=PROBN; run;Univariate 選項:plot:產生圖形-直方圖、盒狀圖、正態分布擬合圖freq:對變量各個取值的頻數及百分比進行分析
  • SAS系列10:SAS基礎統計過程(二)
    PROCFREQ過程可執行定性數據的描述性統計以及假設檢驗。PROC FREQ過程可產生從1維到n維的表格,即頻數表以及列聯表。本節內容主要介紹PROC FREQ過程執行描述性統計指標的計算,其語法如下:*===創建PROC FREQ過程使用的數據集;DATA FREQ; DO GROUP=1 TO 3; DO BLOOD=1 TO 4; INPUT F @@; OUTPUT; END; END; DATALINES