SAS筆記 1 PDV與資料讀入

2021-09-25 12:43:05 字數 3344 閱讀 2222

其實我是不喜歡sas的。當然,我不喜歡她,並不代表她不好,實際上在某些應用場景下sas是款很優秀的軟體。我的資料分析之路始於r,品嚐過r的靈活與簡潔(不論是軟體安裝還是語法)後,再來學習sas,的確提不起興致。然而由於:1.導師的專案資料量較大(幾gb到幾十gb);2.之前的專案**師兄已經用sas很優美地實現了;3.我莫名地當上了該專案負責人,要帶著師弟師妹做該專案。我也只**著頭皮學習sas。奈何現在腦力大不如前,看的東西越來越記不住,於是下定決心梳理一下sas相關知識。

在sas中,我們使用data步來讀入資料,data步在讀入資料時實際上有兩個階段:編譯(compilation)和執行(execution)。過程如下:

在編譯階段中,逐個掃瞄語句,如果發現語法錯誤,sas報錯並終止執行;如果編譯階段中沒有發現任何語法錯誤,進入執行階段。

在執行過程中,data部讀入第一條資料,在sas中建立第一條觀測;讀入第二條資料,在sas中建立第二條觀測;讀入第三條資料,在sas中建立第三條觀測……直至讀入最後一條資料並在sas中建立最後一條觀測。我們可以把這個過程當做隱式迴圈(和do,do while,do until語句區分,它們是顯示迴圈)。

需要注意的是,並不是data步中的所有語句都是在執行階段執行,事實上,可以把data步語句分為兩類:可執行語句(executable)和宣告語句(declarative)。

宣告語句只在編譯階段起作用,它可以放在data步的任何位置。下面是一些基本的data步宣告語句:

length:設定內部變數長度

format:設定變數輸出格式

label:設定變數標籤

drop:指示輸出檔案中刪掉哪些變數

keep:指示輸出檔案中包含哪些變數

與宣告語句不同,可執行語句在data步中順序很重要。比如從外部讀取乙個文字檔案,我們必須以infile語句開始,告訴sas從**讀檔案;然後輸入input語句,告訴sas怎麼讀該檔案。所以,infile語句必須在input語句前面,順序很重要。

sas從外部讀入原始資料(raw data)時,會在編譯階段開始時建立乙個輸入緩衝區(input buffer)來儲存raw data。如果是從外部直接讀入sas資料(.sas7bdat檔案)則不會建立輸入緩衝區。sas在編譯階段還會建立pdv(program data vector),pdv其實就是記憶體中的一塊區域,通過pdv將讀入的raw data的每一條資料變成sas資料集中的每一條觀測。在pdv中有兩個自動變數,_n_和_error_。_n_=1表示正在建立第一條觀測,_n_=2表示正在建立第二條觀測,依次類推。_error_只有0和1兩個取值,等於0表示在建立當前觀測時未發現錯誤,等於1表示在建立當前觀測時發現錯誤。除了這兩個自動變數外,pdv中還有data步在建立的資料變數。

假設在我們電腦d盤裡有乙個student.txt檔案,內容如下(第一行紅字表示每個字元的所佔列位置編號,不是文件內容)

12345678901234567890

barbara 6112d

john 62 175

現在我們用data步讀入這個檔案,並計算每個學生的bmi,看看pdv的工作原理。**很簡單:

data ex1;

infile

'c:\student.txt';

input name $ 1-7 height 9-10 weight 12-14;

bmi = 700*weight/(height*height);

output;

run;

一開始,pdv中只有_n_,_error_這兩個自動變數。

**執行到 input name $ 1-7 height 9-10 weight 12-14;時,pdv中會按照input後變數的順序建立name,height,weight三個變數,d表示dropped,k表示kept。只有帶k的變數才會output到資料集中。

**執行到bmi = 700*weight/(height*height);

時,pdv中建立bmi這個變數

在編譯階段,sas會檢查語法是否正確,在編譯結束的時候,會建立sas資料集的內容描述,包括資料集的名字,觀測數,變數名,變數數目,變數型別,所有這些內容都可以通過contents輸出。

在執行階段的開始,自動變數_n_會被初始化1,自動變數_error_被初始化0。一旦infile語句識別了我們待讀取檔案的路徑,input語句就會把待讀取檔案的第一條資料複製到輸入緩衝區。

接著,我們的輸入指標(input pointer,下圖的紅色箭頭)會在(@)輸入緩衝區的開始處。

然後,輸入指標(紅色箭頭)會根據input語句定義的方式讀入輸入緩衝區的這條記錄,並移動輸入指標,在我們的例子中是將1-7列讀入name,9-10列讀入height,12-14列讀入weight,此時輸入指標位於第15列。將記錄寫入到pdv,因為weight變數型別錯誤,所以weight變數值為空(.),同時_error_會變為1,因為weight為空,所以bmi也為空。

然後執行output語句,將pdv中的這條資料輸出到我們的sas資料集--work邏輯庫中的ex1。到此student.txt中的第一條資料已讀入sas資料集。

sas返回到data步的第一條語句,也就是data ex1;開始讀取student.txt中的第二條資料,此時_n_變為2,_error_重新置為0,其餘過程同上。如此往復,直至我們的輸入指標遇到eof(end of the file),退出迴圈。data步結束。

在我們的這個例子中,如果我們不使用output也可以讀入該資料,這是因為在data步中,當使用者沒有顯式指定output時,sas會隱式呼叫output。不論顯式還是隱式output,它們的作用都是講pdv的那條資料output到我們的sas資料集中。

20160524 資料分析與SAS1 資料模型

一 資料模型共六層 bi指345層 6boss決策 5資料展現層 4資料探勘,和傳統統計分析不一樣,統計分析的目標很清楚手段也很明確,但是資料探勘目標手段都不明確,能挖出什麼來也不確定,資料探勘和資料分析界限不是很分明,統稱為分析層 3統計分析 查詢,觀察資料狀態,如通過平均值 方差 count 排...

《SAS程式設計與資料探勘商業案例》學習筆記之一

今天有空看到一本挺不錯的書,仔細閱讀,發現很多有用的知識點,於是認真研讀起來,以下是初步的要點筆記。切換至日誌視窗的命令是 log 熱鍵是f6 切換至輸出視窗的命令是 output 熱鍵是f7 切換至編輯器視窗快捷鍵是f5 f3,f8是提交 sas程式 ctrl e 是清除視窗中的內容一.查 看資料...

《SAS程式設計與資料探勘商業案例》學習筆記之十四

繼續 sas程式設計與資料探勘商業案例 學習筆記系列,本次重點 常用全程語句 所謂全程語句,是指可以用在任何地方的sas語句,既可以用在data資料步語句裡面,也可以用在proc過程步裡面,甚至可以單獨使用,本次只針對商業應用中常用的語句進行總結 1.comments 語句形式有兩種 comment...