




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、目錄前 言1導讀1此不可以學到什么?2如何更好的學習本?2一.SAS 是什么?3What is SAS?3SAS 模塊產品庫3SAS 的安裝4配置要求如何?4SAS如何獲得?4SAS版本問題?4SAS的安裝4SAS 幫助文檔的結構5第二章語言基礎7第一個 SAS 程序(SAS program)7程序結構:8數據步的自循環(huán)(Data steps Built-in Loop):82.數據類型(Daype):9變量(variable)9變量的類型(type)103.2 變量的類型轉換(Type Convers)10如何創(chuàng)建變量?(Create Variables)10變量的屬性(attributio
2、n)11變量列表(variable list)11自動變量(automatic variable)12常量(constant):13字符常數(character)13數值常數(numeric)14日期、時間和日期時間數值常數(data, time, and datetime)14十六進制常量(hexadecimal)14運算符(operators)15前綴運算符(prefix operator)15中綴運算符(infix operator)15運算次序,跟其他語言大同小異,更詳細準確的說明請參看幫助文檔。166.表達式(expres) 17語句(sement)17數組(array)18數組的定
3、義(definition)18初始化數組(initial-value)19數組元素(Array Reference)208.38.4數組(multidimenal array)20臨時數組(_temporary_)21與數組有關的函數21流程結構:順序、選擇、循環(huán)22選擇結構22循環(huán)結構23語句塊24如何跳出選擇結構和循環(huán)體?25函數與參數(function and parameter)25代碼書寫風格(code)26邏輯庫(library)與數據集(sets)26特殊數據集28第三章 SAS 視窗操作29第四章 輸入數據30第一節(jié)原始數據31原始數據的方式32數據的機制32第二節(jié)輸入格式42
4、輸入格式的語法格式43如何使用 SAS 輸入格式?43輸入格式的類型44數值變量的格式44字符變量的格式45日期時間的格式46用戶自定義格式47informat 語句53length 語句55attrib 語句57第三節(jié)導入數據57proc import 的語法格式58proc import帶分隔符的文件58Excel 文件593.proc c import數據庫表(如 Acs)60第四節(jié)其他輸入數據方式61DDE61連接數據庫61第五章整理數據64第一節(jié)、數據集選項64哪里會用到數據集?64數據集選項65第二節(jié)、在數據步中整理數據集66數據集66修改數據集683.操作多
5、個數據集68第三節(jié)、過程步的整理721.排序 proc sort722.轉置 proc transe75追加 proc append78結構化查詢 proc SQL79標準化過程 proc standard816.求秩過程 r84第四節(jié)、缺失值的處理871.缺失值的類型872.如何缺失值?87缺失是如何產生的?88缺失值如何運算與分析?88總結90第六章 輸出結果90第一節(jié) 輸出方式90輸出數據集90LOG 窗口或文件90Output 窗口/Output 對象/文件92外部文件92第二節(jié) pr過程92語法格式92應用實例94第四節(jié)第五節(jié)export 過程105其他輸出方式106總結107第七章
6、 調試程序107第一節(jié) 錯誤分類1071.句法錯誤(syntax)1082.語義錯誤(sem)108運行錯誤(execution-time)109數據錯誤(data)110宏相關的錯誤(macro-related)110第二節(jié) 如何調試程序1111.Data step debugger 是什么?111調試命令112使用調試命令116第三節(jié) 如何減少錯誤的產生117總結:118附錄 1 SAS 系統(tǒng)管理與環(huán)境設置118附錄 2 SAS 常用語句一覽121前 言縱觀市面上的 SAS 書籍,發(fā)現(xiàn) SAS也不少,但是大多都是統(tǒng)計應用的書籍,而講解SAS 語言基礎的書籍卻很難見到。作為一門語言,語法的是
7、不應該的。較之于其他語言的語法比比皆是,這也確實是一種奇怪的現(xiàn)象。目前大多的 SAS 數據也并不是沒有講到基礎內容,而是都草草的介紹了一些語言基礎就開始把讀者帶入統(tǒng)計過程,本來有些初學者心態(tài)就很急,而作者這么快的就將讀者帶入應用領域,更加沒有人去學好語言基礎了。更有甚者,某些作者在書中寫了一些所謂的標準程序,然后告訴讀者只要按照標準程序去套用就行了,還聲稱這是學習 SAS 最快捷的方法。因此,作者決定寫一本語言基礎的,詳細的講解 SAS 語法。 非常非常高興第一本 SAS 教程經歷一個多月終于出爐了,將其命名為SAS 語言拋磚引玉。該講解 SAS 最最基礎的知識,之所以說是基礎,是因為它跟已有
8、的有一個最大的區(qū)別只有 SAS 語言,沒有任何統(tǒng)計過程。沒有任何統(tǒng)計過程的好處是讀者能夠靜下心來跟隨作者一起去研究 SAS語言,弄懂它,吃透它;而不是剛會走就想著跑甚至想飛,還沒學幾條語句就想去做統(tǒng)計分析,到頭來發(fā)現(xiàn)錯誤而又手足無措。面象任何想學習和了解 SAS 語言的人。此可以學到什么?導讀第一章是介紹SAS。第二章是語言基礎主要是各語法元素:數據類型、表達式(變量、常量、算符)、語句、數組、控制流、函數等,還介紹了 SAS 特別的程序結構和特有的數據集知識。如果有其他語言的基礎學習這一章會很容易理解,多多比較 SAS 語言跟其他語言的區(qū)別對兩門語言都有裨益。第三章是 SAS 的視窗操作只是
9、略加提及,沒有細致。第四章是如何輸入數據? 輸入輸出本就是一門語言最基本的要素,但 SAS 有些特殊,它的輸入方式多種多樣而且稍顯復雜但功能強大,因為作為統(tǒng)計,輸入數據還肩負著如何正確識別。第五章是如何整理數據? 將輸入的數據整理成想要的形式,以便更好的呈現(xiàn)和進行后期分析。第六章是如何輸出數據? 輸出數據跟輸入數據是相反的過程但有著相同的機制,對第四章足夠熟練的掌握基礎上,學習這一章不費吹灰之力。第七章是如何調試程序? 了解通常會出現(xiàn)哪些錯誤對避免措施是很有好處的,LOG 窗口的信息往往是提供了查找語法錯誤的重要信息,而使用 data 步調試器則可以讓程序員很方便的發(fā)現(xiàn)邏輯錯誤。此不可以學到什
10、么?本沒有講到任何統(tǒng)計分析的過程,期望從這里學到如何直接進行諸如 t 檢驗,方差分析,卡方檢驗的人可以到這里止步了。本不是語法參考書,只包含常用的語法,最為準確、和全面的語法說明還是SAS自己的幫助文檔。它是哪個 SAS 模塊中的內容,這只能算是 Base SAS 中很少的一部分知識。如何更好的學習本?本不一定要完全按照順序來讀,有些前面比較基礎的內容舉例中往往用到后面章節(jié)的語句或語法,如果有些不懂,可以先跳過,看過整個后再回頭再慢慢琢磨。 多多結合實例進行學習,這樣才會將語法理解透徹。本出現(xiàn)的例程都經作者測試過,即使從幫助文檔上面弄來的也不例外。如果還問題,可以直接跟作者()交流,也歡迎有人
11、對本進行批評指正。 好了,最后希望本讓你的 SAS 語言知識能夠得到一點點增長,被你忽略的 SAS 編程的細節(jié)能夠重新引起你的重視,似懂非懂的一些問題能夠明了清晰。一.SAS 是什么?What is SAS?SAS is a set of solutions for entrise-wide businesers as well as aerfulfourth-generation programming language and anegrated system of softwareproductsfor performing這是的解釋??梢钥闯?SAS 公司對 SAS 系統(tǒng)的定位:能提供
12、企業(yè)級商業(yè)應用的一整套解決方案;功能強大的第四代程序語言;綜合性的產品庫。可以看出,SAS 已經不僅僅是一個統(tǒng)計,而是一個功能強大的系統(tǒng)。它的強大體現(xiàn)在它龐大的產品庫上,它的觸角幾乎已經伸到數據處理的每一個領域。盡管如此,SAS還是以它的統(tǒng)計功能馳名,這也是它整個系統(tǒng)的基石,所以通常提起 SAS,會認為它是統(tǒng)計。這里我不解釋 SAS 的全稱是什么,但是希望每一個學 SAS 的人應該知道。2.SAS 模塊產品庫前面提到 SAS 是一個綜合產品庫,是因為 SAS 是一個組合系統(tǒng),SAS System 是由一個一個的模塊(或稱為產品)組合到一起,可以單獨和使用某一個模塊或幾個模塊。當然,其中 Bas
13、e SAS 是,除了提供數據管理和一部分統(tǒng)計分析功能外,它是作為其他模塊的基礎而必須存在。至于 SAS 具體包含那些產品/模塊,可以參看有關書籍對 SAS 的介紹或幫助文檔。之所以介紹 SAS 的產品庫,是想讓大家知道,SAS 是一個龐大的系統(tǒng),現(xiàn)在學的只是它一個模塊Base SAS 中很少一部分內容,不要因為會幾個統(tǒng)計過程就以為“精通”SAS,即使高手也要在精通后面限定某個模塊。3.SAS 的安裝配置要求如何?首先說一下配置要求,硬件方面只要不裝在老爺機上就行了,一般近幾年的機器都不存在問題, 至于詳細的硬件配置要求, 有的可以查看幫助文件或者 SAS()。環(huán)境方面,本就只考慮在 Windo
14、ws 系統(tǒng)下的使用。SAS如何獲得?至于 SAS怎么獲得,這個就要靠自己想辦法了,上網搜搜或者去逛逛很容易找到。如果是/企業(yè)用戶,那還是建議SAS 正版,要不然可能的,而且做出來的統(tǒng)計分析可能不能在國際上等等問題。SAS版本問題?很多剛學 SAS 的人在獲得 SAS時總關心一個問題,應該用哪一個版本,而且很多人在動手學 SAS 之前花很大力氣在很多或里面辛苦的找 SAS版本,其實 SAS的版本對于大多數用戶來說沒有那么重要,特別是應用僅僅是統(tǒng)計分析的情況下。前面講了,SAS 是一套系統(tǒng),它發(fā)展到今天已經不僅僅是統(tǒng)計了,還包括很多模塊,而且它的統(tǒng)計分析模塊已經發(fā)展的很成熟。版本的更新無非就是一些
15、功能模塊的擴展、程序算法的優(yōu)化、界面的改進等等,甚至某些更新就是為了適應 64bitcpu 或者OS 的出現(xiàn),這些更新對統(tǒng)計分析等發(fā)展很成模塊影響不是很大。所以個人覺得沒有必要非得用的版本不可,手頭上哪個版本最容易獲得就可以開始學了。國內用戶常用的版本有 6.12 版、8.2 版和9.0/9.1.3 版,本是基于 9.0 版的,某個別地方有版本差別我會在文中給出說明。SAS的安裝安裝 SAS 跟安裝其他 Windows沒區(qū)別,除非你的是 D 版的就有點復雜,具體過程請參考網上。4.SAS 幫助文檔的結構不管什么,它的幫助文檔是很重要的。學習 SAS 僅僅看幫助文檔是不現(xiàn)實的,但是不看文檔的人是
16、學不好 SAS 的,特別是想準確、全面的學習 SAS 的某一方面的知識時,通過SAS 書籍往往是不夠的。因此很有必要在這里突出幫助文檔的重要性。 打開 SAS 幫助,就會看到幫助文檔左邊框架顯示如下的結構+Whats New for SAS 9+Learning to Use SAS+Using SAS Software in Your Operating+SAS Products+SAS User Support ServiWhats New for SAS 9告訴你 SAS 新版本更新的地方,非常詳細的分模塊介紹新特性。如果用戶是從 SAS 低版本遷移過來的想知道新版本不同,或者非常關心
17、SAS的發(fā)展情況,或者是特殊用戶的版本差異對你影響很大,就可以從這里找到。Learning to Use SAS告訴你如何學習使用 SAS。可以通過以下一些途徑學習 SAS:+Acsing the Help System? 幫助文檔+Sle SAS Programs? SAS 實例程序+SAS Online Tutor?手冊+Tutorial: Getting Started with SAS Software?使用指南其中幫助文檔提供了最為準確、和全面的信息,也就是本章為什么要介紹幫助文檔的結構的原因。但是對于中文用戶最大的不便就是幫助文檔是英文版的,所以,如果不懂英討厭英文,那幫助文檔就一
18、文不值了。其實這些英文只要稍微有點 SAS 的知識是很容易看懂的。 例程庫提供了很豐富的程序代碼,而且按模塊分類組織在一起,這樣很方便學習。通過例程的學習可以很好的理解 SAS 語法,而且通過閱讀例程有利于養(yǎng)成良好的編程習慣。 SAS上的支持服務中心(http)也是可以獲得資源的好地方,不便的同樣也是英文。里面有 SAS 每一個模塊 pdf 版本的詳細資料,內容類似于幫助文件;有大量豐富的 SAS例程;有 SAS 用戶總結的文章等等。Using SAS Software in Your Operating這里介紹了如何在特定的操作系統(tǒng)環(huán)境下更好的使用 SAS,如 Windows 下的視窗操作,
19、如何調用其他應用程序以及使用 DDE 等;某些跟機器環(huán)境有關的特性在這里查詢。SAS Products 這里是 SAS 幫助文檔的,每一個模塊的概念、操作、使用以及應用都在這里查詢,這里也是使用率最高的一部分,通常使用文檔就是查看這里的內容。本書的語法參考就來源于 SAS Products-BaseSAS,以及部分例程也來源于此。Base SAS 分為幾大部分。-Whats New in Base SAS 9? Base SAS 9 的新特性-About Base SAS Software? Base SAS 概述+Using Base SAS Software? 如何使用 Base SAS
20、模塊+SASProcedures? Base SAS 的過程參考+SASLanguage Concepts? SAS 語言概念+SASLanguage Elements? SAS 語言元素+Moving and Acsing Files? 移動和文件+Output Delivery System(ODS)? 輸出傳送系統(tǒng)+SQL Query Window? SQL 查詢窗口+SAS Macro Reference? SAS 宏參考SAS 語言概念講述的是語言元素的概念,例如變量、函數、表達式、語句、數據集、過程、輸入輸出格式等等。如果想對這些概念比較清楚的掌握而且弄清楚 SAS 語言的結構和機
21、制,可以詳細的閱讀這一部分。 SAS 語言元素的是具體的元素,例如所有的數據集選項、所有的語句、所有的函數等等都可以在這里找到用法參考。因此如果是想知道某一具體的語句、函數等的用法可以閱讀這一部分內容。SAS User Support Servi常規(guī)性的信息,如如何獲得技術支持,培訓,如何,如何加入 SAS組等等。第二章語言基礎如果你曾經學過一門語言的話,就應該知道語言基礎這里會講些什么內容了。其實各種語言的語法套路是差不多的,無非就是數據類型、變量、常量、運算符、流程結構、函數以及輸入輸出等。1.第一個 SAS 程序(SAS program)title MySAS program;daemp
22、;input group$ x ;cards;A 54.0 B 50.2 A56.6 B 53.8 A 57.3 A 51.2;proc ttest daemp;var x;class group;run;這個程序是用 t 檢驗來檢驗 6-7 歲的城市兒童與農村兒童的是否不同。SAS 程序中,每一行以分號(;)結尾的稱為語句,語句是 SAS 程序最基本的,這跟其他語言是一致的。SAS 程序的層次是非常清楚的,因為它是模塊化的。每一個 SAS 程序是有若干個語句組成,看起來可能非常復雜松散,而實際上 SAS 程序是兩個模塊化的結構即數據步和過程步,以及一些設置環(huán)境變量的全程語句。上面程序中,第一
23、個語句是標題語句,也即是全程語句。data 語句到第 7 行單獨的分號被稱為數據步,proc 語句到 run;語句被稱為過程步。而且有些語句是于數據步的,比如 input 語句和 cards 語句;而有些語句是于過程步,如 var 語句和 class 語句;還有些語句是可以單獨放在任何位置,稱為全程語句。1.1 程序結構:數據步(Data step):用來創(chuàng)建和修改用于統(tǒng)計分析的數據集,實現(xiàn)基礎的編程功能;每個 data 步以 data 語句開始,可以包含任意多個 SAS 程序語句。過程步(Proc step):利用已創(chuàng)建的數據集完成特定的統(tǒng)計分析任務、結果輸出及部分數據集整理功能。proc
24、步以 proc 語句開始,數據集作為輸入;其他語句給出用戶想得到有關結果的信息的程序語句,這些語句依賴戶調用的具體的過程。 數據步只要求以data 步開始,沒有其他限制;而 proc更像一個模板,每一個過程有確定可用的語句,用戶根據需要往上面填寫。所以,說到 SAS 編程,大多的技巧和藝術都集中在數據步,過程步幾乎沒有任何的技巧可言,過程步應用的好壞一方面取決于你前面數據處理的好壞,另一方面取決戶的統(tǒng)計基礎。1.2 數據步的自循環(huán)(Data steps Built-in Loop):個人覺得,如果要學習 SAS,最首先要掌握的就是 SAS 程序的結構及運行機制,而其中最關鍵的又是 data 步
25、的自循環(huán),如果不能夠理解這一點,那后面的內容就如空中樓閣,是不穩(wěn)固的。首先,數據步程序是一行一行的執(zhí)行,這就意味著變量在使用之前必須創(chuàng)建。這一點很容易理解,幾乎所有的語言都是如此。其次,數據步程序是一個觀測一個觀測。當程序正確的執(zhí)行到數據步的最后一個語句時,就將該次的一條觀測寫入數據集,然后又重新開始執(zhí)行數據步,繼續(xù)觀測值,這就是數據步的自循環(huán)。也就是相當于數據步的最后隱含包括了兩個語句,output 與 return語句。第一個問題是的數據在執(zhí)行到最后寫入數據集之前保存在哪里?input 語句執(zhí)行后,SAS 將的數據暫時先保存在內存緩沖區(qū),然后執(zhí)行后面的語句,后面的語句可以對暫存在內存緩沖區(qū)
26、中的變量值進行修改,到最后才將整條數據寫入數據集,寫入數據集的數據就不能在當前 data 步中再修改。第二個問題,在 data 步中間使用 return 語句會怎么樣?自然是按照用戶的意思進行執(zhí)行,當遇到 return 語句時就重新執(zhí)行數據步,下一條觀測值,而跳過 return 后面的語句。第三個問題,在 data 步中間使用 output 語句呢?那么程序會在執(zhí)行到 output 語句那里就把放在內存緩沖區(qū)里面的觀測值寫入數據集,而不是等到整個 data 步執(zhí)行完了再寫入。弄清楚這三個問題了應該弄明白 data 步的自循環(huán)是怎么回事了。而且會發(fā)現(xiàn)原來 data 步不一定是一次只可以一條觀測,
27、完全可以兩條或者條一次的,比如重復 input 語句,并且在每條語句之后加一條 output 語句,就可以實現(xiàn)了。2.數據類型(Daype):在學其他編程語言的時候可能學到很多數據類型,但是 SAS 將各種各樣的數據簡化為兩種類型,即數值型(numeric)和字符型(character)。那么這里就有問題了,像 C 語言那樣豐富的數據類型而且實際上也存在各種類型的數據,SAS 是如何處理的呢?這里就是 SAS的特別之處了,兩種基本的數據類型外加豐富的數據格式就能識別和顯示各種各樣的數據了,但是前提是你要告訴 SAS 怎么去識別和顯示數據,按照什么格式去識別和顯示數據,這里就涉及到 SAS 里面
28、一個比較復雜,數據格式,輸入數據需要指明輸入格式(informat),輸出數據需要指明輸出格式(format),這個內容請參看后面的有關章節(jié),這里先了解一下。另外一個問題,從數據類型角度把語言分為強類型的和弱類型,強類型的比方說 C語言,在使用變量之前得先定義變量,而且必須指定一種數據類型。而 SAS 則是弱類型的,也就是在用使用變量之前是不需要定義的,變量的類型取決于數據的類型或者預先定義的格式。這個在后面的程序中可以的感受到。3.變量(variable)變量名規(guī)范跟其他語言基本相同,要以字母或下劃線開始,不要使用系統(tǒng)保留的名稱等;需要指明的是 SAS 的變量名是大小寫不敏感的,最多 32
29、個字符,不像 SPSS 一樣,SAS并不支持中文變量名,但是可以用變量(label)對變量進行說明,變量支持中文,最多 256 個字符。下面主要講解 SAS 比較特殊的內容。3.1 變量的類型(type)前面講了 SAS 的數據類型只有兩種,數值型和字符型,那么相應的變量類型也是兩種,數值型變量和字符型變量。那么如何用這兩種類型的變量去各種類型的數據?前面一節(jié)提到 SAS 通過豐富的格式數據格式來識別和顯示各種形式的數據,那么識別之后怎么呢?SAS 有一套規(guī)則來將所有的數據轉換成數值型或者字符型來,時間日幣數據都不例外。詳細內容請參看后面有關章節(jié)。?3.2 變量的類型轉換(Type Conve
30、rs)對于變量類型之間(字符型與數值型)的轉換,SAS 有一套規(guī)則如下,如果字符變量與數值運算符在一起使用,則 SAS 將字符變量轉換為數值;如果字符變量與數值變量進行比較符運算,則 SAS 將字符變量轉換為數值;如果數值變量與字符運算符在一起使用,則 SAS 將數值變量轉換為字符;如果在一個賦值語句中,左邊跟右邊的類型不一,則將右邊的類型轉換成左邊的類型;以上這些轉換規(guī)則是 SAS 自動完成的,并且在 LOG 窗口中打印一個警告信息,指示這個轉換發(fā)生的地方。以上這些情況在編程的時候最好是不要出現(xiàn),因為雖然是自動完成,但是轉換的結果不一定是預期的,比方說字符變量轉換成數值時產生的是一個無效的數
31、值,結果就造成了缺失值,當然 SAS 會在 LOG 窗口中提示出錯信息,同時置自動變量_ERROR_的值為 1。3.3 如何創(chuàng)建變量?(Create Variables)SAS 是弱類型的語言,使用變量前不需要定義,可以在數據步中直接使用變量,當然更多的情形是在用 input 語句數據時。如果是要預先定義變量的格式,則用 format 語句、informat 語句、length 語句或 attrib 語句都可以創(chuàng)建變量。3.4 變量的屬性(attribution)通常說起變量,就是指變量的名稱。其實變量名只是變量的屬性之一。 打開一個數據集,然后選定任意一列,點擊右鍵查看屬性就會發(fā)現(xiàn)第一個選項
32、卡是 general,這個對話框里面的內容即為變量的屬性,包括變量名、類型、長度及其輸入輸出格式。變量名用來標識變量,區(qū)分不同的變量;類型是指變量是字符型還是數值型;用來補充變量的信息,特別是 SAS 變量不支持中文命名的情況下可以將中文說明寫在變量里;長度是變量所有容納的最多字符的字節(jié)數或最大數值的字節(jié)數,在沒有指定的情況下通常由input 語句第一個觀測值確定下來,當然可以用語句事先指定;輸入輸出格式用來輸入輸出數據,讓 SAS 能對與外部的數據能實現(xiàn)轉換,3.5 變量列表(variable list)在一個數據集中,變量按照第一次的出現(xiàn)的順序(也就是在數據集中的順序)被 SAS系統(tǒng)為一個
33、系列,這個系列就是一個完整的變量列表。而實際上在操作變量的時候只需要選取其中部分變量,而有了這個完整的變量列表就可以在許多語句中使用縮寫的變量列表了。在 SAS 中,可以使用 4 種縮寫的變量形式:(1)數字系列如果有一系列變量是這樣定義的,相同的名字后面加上續(xù)的數字,就可以采用數字系列的縮寫,如x1, x2, x3, , xn 可以縮寫為x1-xn(2)變量名系列變量名系列就依賴于變量在 SAS 數據集中出現(xiàn)的順序,如x-a 就表示從 x 變量開始一直到 a 變量結束這一系列變量,結合自動變量就可以更加靈活的使用變量列表,如x-numeric-a 表示從x 變量開始到 a 變量結束之間的所有
34、數值型變量,x-character-a 表示從從x 變量開始到 a 變量結束之間的所有字符型變量,(3)前綴名系列如果有一系列變量具有相同的前綴名,比方說SALES_JAN,SALES_FEB,SALES_MAR則可以使用下面的形式表示這一系列變量名,sales:打印這些變量,則proc pr;var sales:;run;對這些變量求和,則sum (of sales:)(4)特殊的變量列表包括三個自動變量代表的變量列表_ALL_全部變量_CHARACTER_ 全部字符型變量_NUMERIC_ 全部數值型變量3.6 自動變量(automatic variable)自動變量是在程序中被 SAS
35、自動創(chuàng)建的變量,這些變量名有著特殊的用途,下面介紹一下在 data 步中的兩個自動變量,過程步中的自動變量在具體的過程中講解。_N_N_在 data 步開始執(zhí)行前被初始化為 1,然后 data 步自循環(huán)一次該變量增加 1,也就是_N_代表 data步循環(huán)執(zhí)行的次數。這個變量存在于每一個數據集中,但是一般不會顯示也不會被打印。_ERROR_ERROR_在data 步執(zhí)行前被初始化為 0,當 data 步執(zhí)行過程中遇到錯誤時就會自動被置為 1,而且會在 LOG 窗口中打印出來,這樣有利于調試程序的時候定位錯誤出現(xiàn)的位置以及出現(xiàn)錯誤時采取相應的處理。Tips:這里還是說一下 SAS 的變量命名規(guī)則:
36、首字符要以字母或者下劃線開始;名稱中只能包含字母、數字和下劃線;變量名可以是大寫,可以是小寫,也可以是混合寫的,但是 SAS 會當作是同一個變量名,也就是大小寫不敏感;不要與系統(tǒng)保留的字段同名,比方_N_;變量名長度,SAS9.0 是 32 位,6.12 版和 8.2 版是 8 位;說明:其實這些規(guī)則同樣適用于命名數組、邏輯庫、數據集、宏變量、宏名、函數等等,不同的地方是長度限制可能不一樣,具體可以查看幫助文件。4.常量(constant):常量與變量是一個相對的概念。變量是用來數值的,而且是可以重新賦值的,而常量是用來表示固定的值,是不可改變的。常量可以是是一個數字、字符串或者其他特殊記號。
37、常量和變量還有運算符一起是表達式的元素。 常量的類型,SAS 使用四種類型常數,另外,十六進制常量單獨列出來講。4.1 字符常數(character)字符常數是用引號(單引號/雙引號)引起來的 1-32767 個字符組成的字符串,如,Tom, Tom等如果是字符串中包含引號,該怎么辦?兩種方法方法一:如果包含單引號,怎么引號引起來,相反,則用單引號引起來,如,Toms 表示 TomsToms 表示 Toms方法二:對包含在字符串中的引號可以寫成連續(xù)的兩個引號,如,Toms 表示 TomsToms表示 Toms4.2 數值常數(numeric)數值常數就是指在 SAS 語句中的數字,可以包含數字
38、、小數點、符號和特殊記號 E,如,1, -5, +49, 1.23, 01, 1.2E23, 0.5E-10 等等注意:若一個數值常數大于 10E32-1,則必須表示成科學。4.3日期、 時間和日期時間數值常數(data,time,anddatetime)為了將日期、時間或日期時間值表示成常數,使用在輸入格式和輸出格式中被使用的相同的記法,TIME., DATA.和 DAIME.。格式值用單/雙引號引起來,并跟隨一個表示格式的字母 D(日期)、T(時間)或 DT(日期時間)。如,1jan2006d;9:25t;9:25:19pmt;18jan2002:9:27:05amdt;4.4 十六進制常
39、量(hexadecimal)十六進制字符常量:是用引號引起來的一串偶數個的十六進制字符,并跟隨一個 X,如,534153x而且可以在這一串十六進制字符中使用逗號分隔使得易讀但不影響十六進制常數的值,只是這里的逗號必須按偶數個來分隔。如上面的常數可以寫為,53,41,53x十六進制數值常量:通常,十六進制數值常數用一個數字開始(一般是 0),緊跟著很多十六進制位,并用字母 x 結尾。這個常數可以包括最多 16 個有效的十六進制位,如,0c1x, 9x5.運算符(operators)在 SAS 中,算符包括運算符、括號和函數。其中運算符可以分為兩種,前綴運算符和中綴運算符,中綴運算符包括算術、比較
40、、邏輯、特殊運算符。5.1 前綴運算符(prefix operator)前綴運算符可以用于變量、常數、函數以及括號括起來的表達式,包括正號(+)、負號(-)及非運算(NOT)。如,+y-25-cos(angle1)+(x*y)5.2 中綴運算符(infix operator)算術運算符:+, -, *, /, *, 加減乘除在各種語言里面都是一樣,只是乘方可能有些差別,SAS 是使用*;比較運算符:= (EQ), =(NE), (GT), =(GE), =(LE), IN()前面這些運算符分別代表等于、不等于、大于、小于、不小于、不大于,等于列表中一個。其實平常用的話只要知道用符號就行,括號里
41、面的字母是跟符號等價的,了解一下的好處是可以看懂別人的代碼,不至于以為是變量名或者英文單詞。在 SAS 語法中,比較運算符是可以連用的,例如if (90=x=100) then grade=A;邏輯運算符:&(AND), |(OR), (NOT), 分別代表與或非,括號里面單詞跟符號等價。其他特殊運算符:, , |(max)取最大值,例如:a=8.2;b=9.0;min=(ab);則 min 變量等于 9.0。(min)取最小值。|(連接):用來連接字符串,例如:a=o, ;b=SAS;c=System!;new=a|b|c;則 new 變量等于o, SAS System!5.3 運算次序,跟
42、其他語言大同小異,更詳細準確的說明請參看幫助文檔。思考題 1:比較運算符為什么要選用那些字母呢?6.表達式(expres)表達式是由一系列算符和運算對象形成的一個指令集,它被執(zhí)行后產生一個目標值。運算對象包括變量和常數;算符包括運算符、函數和括號。變量和常量是程序處理的兩種基本數據對象,算符指定將要進行的操作,表達式則是用算符將變量或常量組合起來生成新的值。7.語句(sement)一個 SAS 語句是由 SAS 關鍵字、SAS 名字、特殊字符和運算符組成的字符串,并以分號(semicolon)結尾,它要求 SAS 系統(tǒng)執(zhí)行一種操作或給 SAS 系統(tǒng)提供信息。下面舉例說明什么是關鍵字,名字,特殊
43、字符和運算符等,真要解釋概念可能到頭來我也講不清楚,你也聽不明白。put x $15.;daemp;proc means data=hospital.patiant maxdec=3;infile rawdata;=1 to dim(eachitem);key1:total+1;*這是注釋語句;上面這些語句中,x, total 是變量名字;temp 和 hospital.patiant 是 SAS 數據集名字,其中 hospital 是庫標記;$15.是格式名字;means 是過程名字;data=和 maxdec=是 means語句中的選項;rawdata 是一個文件標記;最后一個語句是注釋語
44、句??梢詮倪@些例子中看出,語句都是以分號結尾的,注釋語句也是如此。語句分類:在 SAS 中語句分為兩大類,data 步語句和全程語句。其中 data 步語句又分為五類:文件操作語句、運行語句、控制語句、信息語句、窗口語句。文件操作語句:用于操作文件,這些文件用于輸入數據集;或者用于輸出。運行語句(動作語句):用于創(chuàng)建、修改或刪除變量;或者用來操作;或者用來錯誤信息??刂普Z句:實現(xiàn)流程控制的語句。信息語句:給出關于數據集的附加信息,包括數據集中變量的信息。窗口語句:用于顯示輸出或者接受輸入。大部分的語句將在本中相應位置講到,想快速獲得其用法請參看附錄 2SAS 常用語句一覽。8.數組(array
45、)數組是用來臨時存放一系列變量的語法結構,常用于需要對一些變量做相同處理的情況。注意:SAS 的數組跟標準語言的數組是不一樣,這一點首先要弄明白。在 SAS 中,數組不是數據結構,它的不是數據,而是變量,因此數組元素即是變量,也就是凡是可用表達式的地方,均可使用數組元素;數組只在當前 data 步中有效,也就是數組名只能在當前 data步中標識數組,不同的 data 步中可以使用相同的數組名但不表示同一個數組;默認情況下,數組的標號是從 1 開始的。8.1 數組的定義(definition)ARRAY array-name subscript contentgt; ;說明:數組名名規(guī)范與變量命
46、名完全相同,不贅述;但是數組名不能與當前 data 步中變量同名;元素個數有三種形式,分別對應于創(chuàng)建數組的三種方法;元素個數必須用大括號()、中括號()或圓括號()括起來,三者等價;變量列表必須由相同類型的變量組成,要么全是數值型,要么全是字符型;數組列表同樣可以是縮寫形式;定義數組最簡單的方法是直接寫明元素的個數,如,array books3 Reference Usageroduction;也可以用上下界來定義元素個數的范圍,如array books0:2 Reference Usageroduction;這樣的好處是可以自定義數組第一個元素的標號,上面的例子就是從 0 開始的,自定義標號
47、某些時候會帶來好處,如array10 Year76-Year85;array second76:85 Year76-Year85;數組 second 顯然更方便,不容易引起。定義數組還可以讓系統(tǒng)來計算元素的個數,如array score * score1 score2 score3 score4 score5;或 array score * score1-5;這種定義的方式的用于不知道變量個數的情況下,變量的個數就交給 SAS 去計算把,如,array x * _NUMERIC_;如果是數組定義一系列字符變量,還可以通過 length 指定字符變量的長度,如array ch * $ 20 na
48、me1-3;思考題 2:那么如果要循環(huán)這個數組呢,是不是用戶還得要知道這個數組有多少個元素?8.2 初始化數組(initial-value)初始化數組時間上是給數組元素即變量賦值,ARRAY array-name number-of-elements(initial-value-1);如,array test(3) t1 t2 t3(90 80 70);array ab(5) (5 4 3);如果初始值比數組元素少,則初始值依次賦值給變量,多余的變量被處理為缺失值,而且SAS 會在 LOG 窗口中給與 WARNING 提示。 給數組元素賦值可以采用縮寫的形式,如下面 5種初始化數組的方法是等價
49、的,ARRAYx10 x1-x10(10*5);ARRAYx10 x1-x10(5*(5 5);ARRAYx10 x1-x10(5 5 3*(5 5) 5 5);ARRAYx10 x1-x10(2*(5 5) 5 5 2*(5 5);ARRAYx10 x1-x10(2*(5 2*(5 5);數組元素(Array Reference)8.3語法:array-name subscript;不同的方式在于數組下標的不一樣。變量作為下標,主要用于循環(huán)語句中variable-1如,array days7 d1-d7;=1 to 7;if daysi=99 then daysi=100;end;*號作為下
50、標 * 如,array days7 d1-d7;input days * ;表達式作為下標expres-1如,array arr1 * a1-a3;x=1;input a1 a2 arr1x+2;直接使用數組名見 do over array-name 循環(huán)結構數組(multidimen8.4al array)定義數組跟一維數組沒有大多區(qū)別,只是不同的維度之間用逗號隔開,同一維度同樣可以采用元素個數或上下界的書寫方式,但不能用*書寫方式,如array x5,3 score1-score15;array test3:4,3:7 test1-test10;數組中,數值元素(即變量)先行后列依次進行填
51、充。及初始化數組都跟一維數組一致。8.5 臨時數組(_temporary_)當用戶定義一個數組的目的只是進行計算時,經常用臨時數組元素列表,使用臨時數組元素可以少的占用內存,加快執(zhí)行速度。舉例,array test4 _TEMPORARY_ (90 80 70 70);另外,臨時數組還有如下一些特點:數組元素沒有名字,時必須用數組名和下表,如 test1;不能出現(xiàn)在輸出的數據集上;不能用特殊下標(*)來所有元素;臨時數組元素的值總是自動被保存,而不是像普通數組元素在 data 步的下一次自循環(huán)開始時被置為缺失值。8.6 與數組有關的函數DIMn(array-name):計算數組第 n 維的元素
52、個數,第一維時寫為 DIM,例如:=1 to dim(days);=1 to dim4(days) by 2;DIMn 函數常用于不知道數組元素的情況下,如用*創(chuàng)建的數組。LBOUNDn(array-name)&HBOUNDn(array-name):計算數組第 n 維的下屆與上屆,第一維時省略 n,例如:array years72:76second third fourth fifth;=lbound(years) to hbound(years);if yearsi=99 then yearsi=.;end;這兩個函數常用上下界形式創(chuàng)建的數組的情況下。思考題 3:為什么數組名與同 data
53、 步的變量名不能同名?思考題 4:像其他語言一樣,數組標號從 0 開始好處嗎?9.流程結構:順序、選擇、循環(huán)程序語言中的流程結構用于控制各計算操作執(zhí)行的次序。每一種結構化語言編寫的程序都由由順序、選擇、循環(huán)三種結構,SAS 也是如此,不同語言之間只是關鍵字不一樣罷了。順序結構就是指程序執(zhí)行是按照代碼書寫的順序進行的。下面主要講選擇和循環(huán)結構。9.1 選擇結構語句一:IF expresTHEN sement;語句二:SELECT ;WHEN-1 (when-expres-1 ) sement;. WHEN-n (when-expres-1 ) sement;根據它的語法結構發(fā)現(xiàn)有兩種寫法,舉例如
54、下既可以把表達式放在select 語句這里,when 語句那里只需要選擇表達式的值;也可以select語句這里為空,整個選擇條件放到 when 語句中;而不能兩種方式混合使用。方法一select(x);when (2) put two;end;方法二select;when (x=2) put two;end;錯誤的方法select (x);when (x=2) put two;end;對于 select 選擇結構還有一點要注意的地方,就是 select 與 end 之間的程序的執(zhí)行順序,這跟其他語言(如 C 語言)可能有點差別,那就是只要有一個條件滿足那么就會跳出選擇結構,而不是繼續(xù)執(zhí)行下面的
55、語句,這樣一來就不需要顯性的去跳出選擇結構。9.2 循環(huán)結構語句一:DO WHILE (expres);.more SAS sements.END;語句二:DO UNTIL (expres);.more SAS sements.END;語句三:ndex-variable=start ;. . . more SAS sements . . .END;例如:=1 to 10;=01JAN90d to01JAN90d by 1;=10 to 0 by -1while(month=JAN);這個就是常見的步長型循環(huán)結構,而且還可以結合 While 與 Until 使用來終止循環(huán)。那么這里如果 do 后
56、面什么都不寫是否是“無限”循環(huán)了呢?留作讀者思考語句四:tem-1;. . . more SAS sements . . .END;例如:do count=2,3,5,7,11,13,17;do month=JAN,FEB,MAR;=01JAN2001d,25FEB2001d,18APR2001d;這個語句是 SAS 比較特殊的循環(huán)結構,可以對枚舉的項目依次執(zhí)行,終止循環(huán)就是執(zhí)行完這些列舉的項目。語句五:DO over array-name;. . . more SAS sements. . .END;例如:daest;input sc01-sc05;array s sc01-sc05;do
57、over s;s= s*100;end;cards;0.95 0.88 0.57 0.90 0.65;這個語句也是 SAS 比較特殊的循環(huán)結構,于數組,將數組的每一個元素一遍。9.3 語句塊DO;.more SAS sements.END;有時候需要把很多語句放在一起執(zhí)行,特別是放在選擇結構和循環(huán)結構中,這相當于有些語言的一對。9.4 如何跳出選擇結構和循環(huán)體?continue 語句:用于跳出當次循環(huán),重新執(zhí)行循環(huán)體并計算是否滿足條件。leave 語句:用于終止循環(huán)和選擇結構,不再執(zhí)行循環(huán)語句而轉到循環(huán)語句之后緊接的語句。return 語句:用于跳出當次 data 步自循環(huán),重新執(zhí)行 data
58、 步。go to 語句與標號:用于跳轉到指定標號的語句,但該語句要求與當前語句是在同一個 data步中。在大多數情況下,使用 go to 語句的程序段完全可以用 do;.end;程序塊或者 ifelse 結構來代替,而且使用 go to 語句會使程序顯得復雜、難以理解和,所以建議還是少用。但是這個語句既然存在還是有一些用處的,可以用來跳出某些嵌套的結構,如跳出多層循環(huán)。10.函數與參數(function and parameter)函數的本質是一個子程序,它能提供一些小的功能模塊,不用去自己寫一些代碼。事實上,這些代碼即使自己想寫也不一定能寫出來,簡單的求絕對值之類的可能還湊合,有些書把它作為
59、函數的例子來講解,但是要寫一個三角函數或者概率函數就不一定人人都會了。所以,幾乎每一門語言都提供了很多系統(tǒng)函數。SAS 的功能強大和全面在它提供的函數上就有充分的體現(xiàn),按照 SAS 文檔上面比較細的劃分,SAS 函數共有 25 類,功能涉及字符、字符串、數學、算術、概率與密度、分位數、隨機、日期與時間等。相比較于其他語言,SAS 提供了的統(tǒng)計相關的函數。 函數的基本形式都是由函數名稱和參數組成的,SAS 函數也不例外,只是對函數的調用可能有點差異。SAS 函數調用有下面三種形式:function-name(argument-1)function-name(OF variable-list)fu
60、nction-name(OF array-name*)可以看出,這三種方式只是參數的寫法不同而已,本質上是變量列表的方式不同而已。舉例如下:sum(x,y, z);sum(ofx y z);sum(ofx1-x10);sum (of x10);錯誤的寫法:sum (x y z);至于自定義函數,SAS 并不支持自定義函數,不過它有相應的其他語法結構來實現(xiàn)這個功能,那就是宏。有關宏詳細的信息請參看后面有關的章節(jié)。11.代碼書寫風格(code)首先看看 SAS 允許你怎么寫代碼?SAS 程序是由語句組成的,SAS 語句可以從一行上的任意位置開始;也可以任意位置結束,只要語句中的單詞不被換行斷開。也
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)保工程承包與實施合同
- 樣機報廢說明
- 電子會議參與情況統(tǒng)計表
- 四川省達州市渠縣中學2025屆高三下學期二??荚嚨乩碓囶}(含答案)
- 汽車維修技術發(fā)動機原理與故障診斷試題
- 在公司年會上的致辭報告
- 《光的三原色原理及其應用:初中物理教學教案》
- 物流行業(yè)貨物運輸延誤免責協(xié)議書
- 運營商相關知識培訓課件
- 心理學基礎與應用測試卷
- 2023年浙江農商聯(lián)合銀行招聘考試真題
- 主任臨床查房程序規(guī)范及評分標準
- 工業(yè)氣體分離技術與設備管理手冊
- 汽車底盤課件 課題7 行駛系統(tǒng)概述
- 小學教師讀書分享活動課件
- 《一橋飛架連天塹》課件 2024-2025學年嶺南美版 (2024)初中美術七年級上冊
- 《經濟法學》(第三版)電子教案
- 營地布景規(guī)劃方案
- 《線性代數》全套教學課件
- 北京市企業(yè)考勤管理制度
- 2024年全國醫(yī)學考博英語試題
評論
0/150
提交評論