SAS BASE數分--常用DATA步數據處理
先來總結一下DATA步的運行順序,其餘語句按照運行邏輯運行
DATA 語句
數據讀入語句
INPUT (自定義輸入數據,定義其欄位名,欄位類型以及欄位觀測值)
SET (輸入已有的數據集,指定邏輯庫名稱以及數據集名稱:SASHELP.CLASS)
MERGE (合併兩個或者多個數據集)
MODIFY (插入或者對已知數據集中的觀測進行替換刪除)
UPDATE (更新文件數據中的觀測)
接下來介紹項目中常常會用到的一些語句。
1.INPUT語句(自定義數據集。其實項目上不經常用,但是由於有些語句在學習時需要自定義一些數據集,所以在這舉3個例子)。
eg1:代碼輸入
SAS輸出1:
eg2:代碼輸入
SAS輸出2:
eg3:代碼輸入
SAS輸出3:n
數據集a這裡輸入了 a b c三個變數,$代表是字元型。
數據集b後面4個分號是因為輸入的觀測中有分號,所以需要使用cards4以及結尾4個分號。
數據集c變數後面加了@@的符號,是為了可以使得SAS可以在一行中連續讀取a的觀測值,如果不寫@@那麼需要寫10行,每行一個觀測才能把a變數的所有觀測讀進去。
2.SET語句
eg1:代碼輸入(引用已有數據集)
SAS輸出1:n
eg2:代碼輸入(point 規定臨時變數set語句讀入的觀測序號,指定輸出數據集a中的3,5,7,4觀測值)n
SAS輸出2:n
eg3:代碼輸入(連續兩個set語句(橫向合併--不常用))
先準備3個模擬數據集
以上分別是數據集a,b1,b2
SAS輸出3:依次是c,d
eg4:代碼輸入(一個set兩個數據集(縱向合併--常用在數據結構一直的數據集上)
SAS輸出4:n
eg5:代碼輸入(如果想從一個數據集中同時生成兩個新數據集-第一種,挑選不同變數;第二種,挑選不同觀測)
SAS輸出5:
可以用keep保留 drop清除 rename重命名 where篩選觀測 以及label添加標籤對數據集進行限定。
3.MERGE語句關聯數據集。(常用)
eg:代碼輸入:n
數據集a,b1拿上面set的例子。
注意1:關聯前先排序,去重。關聯關係只能是一對一,一對多,多對一的關係,兩張表中至少對其中一張表對關聯鍵去重。
注意2:其中,flag=compress(a||b);會有三種結果,10,01,11。11指在a 也在 b 中;10指在a中不在b1中;01指在b1中不在a中。 if a 是指任命a表為主表,保留a表中所有信息,不保留未關聯上的b1表中信息,此時flag 只會有11 和 10情況。(in=a)(in=b)是固定寫法,是指將在a表中的關聯鍵任命為a的意思。
SAS輸出5:n
只把附表中與主表中有的相同的X合併進了主表。
4.RETAIN語句(常用)
eg1:代碼輸入(保留前一條狀態):
SAS輸出1:n
eg2:代碼輸入(用於賦值):
SAS輸出2:
eg3:代碼輸入(實現累乘累加):
SAS輸出3:n
當下一條沒有賦值時,前面的值將被保留。賦初始值.()只對括弧裡面那一個賦值。
延伸小節
在項目上常常會遇到的情況是我們需要對缺失的值進行補充,比如某個客戶的信息是每月更新一條,但是並不是每月都有這樣的一條記錄,這時候就需要生成一條與上月狀態相同的但是月份增加的觀測。以下就總結一下類似這樣的情況以及其處理方法。
A-----1,如果有完整的每個月的記錄,只是某個狀態缺失:用RETAIN 某個狀態按照上一條記錄讀取;
輸入:
輸出:
B-----2,如果沒有缺失只有斷點,需要在斷點之間延續上一個欄位的內容,補充缺失月以及缺失狀態;
輸入:
輸出:
用新生成的qq和mm代替b和c。代碼的邏輯就是先分組,對於每組計算了一下如果下一條與上一條相差值,如果為1是我們需要的,如果不為1那麼相差的值減一就是我們需要補充的觀測值數量,然後再一條一條補充,補充的觀測狀態延續上一條狀態。
lag函數是指生成指定列每條觀測的上一條觀測,第一條為缺失。if first或者if last是在排序分組後,對每一組的第一條觀測和最後一條觀測進行指定賦值。
5.基本新增變數的函數語句和語法LENGTH SUM MAX
eg:代碼輸入:
新增變數時記得賦予其長度,如果不賦予長度那麼默認第一個變數長度,這裡長度不能小於20,因為在SAS中字元佔3個長度,數字1個長度。n
SAS輸出:n
6.INPUT PUT MDY 等字元型變數與數值型變數間的轉換。
eg:代碼輸入:n
SAS輸出:
具體的關於數值型日期,字元型日期怎樣轉化成日期型格式,在專欄第一章有陳列,這裡不一一再贅述。
6.DO循環語句(常用)
eg1:代碼輸入(簡單do語句):
SAS輸出1:
eg2:代碼輸入(do while語句,有條件的循環語句當年齡大於14歲,重複執行do語句):
SAS輸出2:n
eg3:代碼輸入(do until語句,直到不滿足條件停止循環):
SAS輸出3:
eg4:代碼輸入(do over 語句--對數組進行循環處理,數組會下一步列出來):
SAS輸出4:n
經常使用循環語句的地方在於我們需要每個客戶每個月的一條數據記錄,如果缺失我們需要循環把每組的缺失補充出來;還有就是推導客戶逾期情況,應還款日和實際還款日之間的月份差值以及逾期期數也是需要用到循環語句的。可以說是掌握並且靈活應用是非常重要的。n
7.ARRAY數組(常用--能夠批量對欄位進行一定邏輯的處理)
數組分為顯示下標數組和隱含下標數組兩種。
A--顯示下標數組包含數組名稱,數組值,以及數組下標。
eg1代碼輸入:
定義數組:
數組初始值展示:
引用數組:
SAS輸出1:new 一個叫test的數組,有10個數組元素,分別是....
put 日誌中輸出第四個和第六個數組元素:
eg2:代碼輸入(循環DO組中引用 (dim函數可以獲得數組中的元素個數):
SAS輸出2:newdo。一個叫day的數組,(3:10)是指數組元素是由qa1-qa10的第三個到第十個組成。array day(*) _numeric_是指將所有數值型的欄位組成一個數組叫做day ,有多少個數值,*就為幾。
newdo2
eg3:代碼輸入(使用do while 和 do until引用數組)
SAS輸出3:
B--隱含下標數組由變數名,下標變數,列表名組成,引用時才需要指定下標。n
eg1:代碼輸入(引用數組)
SAS輸出1:
eg2:代碼輸入(用循環DO引用,使得每個變數值都*100)
SAS輸出2:
eg3:代碼輸入(do over 數組中所有缺失值都為0,如果數組觀測值多的話,這樣操作就非常簡便了)
SAS輸出3:
eg4:代碼輸入(一個數組引用另一個數組)
SAS輸出4:
eg5:代碼輸入(do while)n
SAS輸出5(日誌中):n
數組在行為衍生變數以及徵信衍生變數用得非常頻繁,因為可以用於批量計算近12個月,6個月,3個月的各種狀態的數據。是非常重要的一塊。
下次更新SQL語句啦~~~
推薦閱讀:
※sas界面為什麼那麼丑?
※求如何用stata或者sas做heckman兩階段的編程或者步驟。 ?
※PaddingRight=
※漫談SAS Macro (3) - Macro Quoting, Part II
※漫談SAS Macro (3) - Macro Quoting, Part III