SAS 操作數據集的觀測
1. SAS表達式
表達式是操作數和操作符的序列,該序列會形成一組可執行並產生 結果值的指令。其中,操作數可以是常量、變量或表達式;操作符是表 示比較、數學計算或邏輯運算的符號,也可以是SAS函數或者括號組。 在SAS程序語句中,創建變量、賦值、求新值、轉換變量和執行條件處理都會用到表達式。
1.操作數
操作數可以是常量、變量或表達式。SAS常量是表示一個固定值的 數字或字符串。常量可用作許多SAS語句的表達式,包括變量賦值語句 和IF-THEN語句,還可作為特定選項的值,例如OBS=5。SAS中存在4 類常量:字符常量、數字常量、時間日期常量和位測試常量。
(1)字符常量 字符常量由1到32767個字符組成,並且必須放在引號(單引號或雙引號)中。在下面的SAS語句中,Tom是一個字符常量。
if name='Tom' then do;
如果字符常量包括單引號,則將該常量放入雙引號中。例如,為了指定字符值Tom's,使用下面的形式:
if name="Tom's" then do;
或者將字符串放入單引號,並且用兩個連續的單引號表示撇號。 SAS將兩個連續的引號作為一個引號。例如,要表示字符串Tom's,則 使用下面的形式:
if name='Tom''s' then do;
要表示Tom“s,可以使用以下形式:
if name="Tom""s" then do;
注意 使用引號一定要匹配,否則會致使SAS誤讀當前的錯誤語
(2)數字常量 數字常量指的是SAS語句中出現的數字值。
(3)時間日期常量 在SAS中還可以創建日期常量、時間常量、時間日期常量。這些常量的形式為包含在單引號或雙引號中的指定日期或時間,並接着跟隨一 個d(日期)、t(時間)或dt(日期時間)來說明值的類型。例 如,'1jan2013'd、'9:25't、'01may12:9:30:00'dt。
(4)變量 變量是一組描述給定特性的數據值,可用於表達式中。 如果在一個表達式中指定了變量,但是變量值不匹配需要的類型,例如,在需要數值變量的地方使用了字符變量,或者相反,在需要字符 變量的地方使用了數值變量,SAS則會嘗試將該變量值轉換成所期望的 類型。SAS會按照如下規則自動在字符變量和數值變量之間轉換:
·如果使用要求數字操作數的操作符(例如加號+)時指定了字符變 量,SAS將字符變量值轉換為數字。
·在使用比較操作符比較字符變量和數值變量時,SAS會將字符變量 值轉換為數字。
·如果使用要求字符操作數的操作符(例如級聯操作符)時指定使用了數值變量,SAS使用格式BEST12.將數值變量值轉換為字符。
·如果在賦值語句的左側使用了數值變量而右側是字符變量,SAS會 將字符變量值轉換為數字。反之,當左側是字符變量而右側是數值變量 時,SAS會使用格式BESTn.將數值變量值轉換為字符。其中,n是左側 變量的長度。
當執行自動轉換時,SAS會在日志中打印提示信息,表明發生了轉 換。如果將字符變量值轉換成數字時產生了無效的數字值,那么表達式 的結果是缺失值,並且會在日志窗口打印錯誤消息,同時,會將自動變 量_ERROR_設置為1。
2. 操作符
操作符包含算術操作符、比較操作符、邏輯操作符等,分別用於算 術運算、比較表達式和對布爾值進行操作等。此外,它還提供了一些只 能用於WHERE語句或WHERE=選項的操作符。
(1)算術操作符
使用算術操作符的表達式其運算結果是數值。表給出了算術操作符的定義、示例及示例表達式的計算結果。
算術操作符號
(2)比較操作符
使用比較操作符的表達式其運算結果是真(1)或假(0)。
比較操作符
在對數字值進行比較時,SAS會基於值進行比較。缺失數字值小於 任何其他數字值。表達式為真時,表達式的結果是1或真(true);表達 式為假時,表達式的結果是0或假(false)。比較操作符常用於IF- THEN語句中,如以下例子:
if x<y then c=5; else c=12;
也可在賦值語句表達式中使用比較,例如:
c=5*(x<y)+12*(x>=y);
這時,SAS先計算括號內表達式(x<y)和(x>=y)的值(為0或1),然后使用計算結果替代括號里的表達式。因此,假設x=6,y=8, 那么賦值語句c=5*(1)+12*(0)的結果是c=5。
字符操作數的比較也會產生數字值1(或真)或0(或假)。SAS會 從左至右逐個字符對字符操作數進行比較。空格和缺失值小於其他任何 可打印字符值。字符順序依賴於計算機的排列順序,此順序通常指的是在ASCII或EBCDIC編碼中的順序。例如在EBCDIC和ASCII的排列順序中,G大於A。因此,表達式'Gray'>'Adams'的值為1或真。
如果是不同長度的兩個字符值進行比較,在比較之前,SAS會假設 已經用空格補充到了較短的字符操作數結尾處,使兩個字符值有了相同 的長度。在比較中尾綴空格會忽略,所以'fox'等於'fox'。然而,在字符值開始處和中間的空格都會參與比較,所以,'fox'不等於'fox'。
還可以在比較操作符之后使用“:”來比較字符表達式的指定前綴。 SAS會在比較過程中截斷較長的值使其與較短值的長度一致。在下面的 例子中,在等於符號后面的冒號修改器告訴SAS僅查看變量LastName的 第一個字符是否為S。
if lastname=:'S';
(3)邏輯(布爾)操作符 使用邏輯操作符的表達式其運算結果是布爾值,即為真(1)或假(0)。下表給出SAS的邏輯操作符、等效字符、示例及其說明。
邏輯操作符
(4)其他操作符 在SAS表達式中還可以使用一些其他操作符,例如級聯操作、括號等
*級聯符號取決於當前操作環境。 在表達式,特別是包含多個操作符的復合表達式中,經常會將一些子表達式放入括號()中,表示優先對括號中的表達式求值,同時也會提高表達式的易讀性。級聯操作符||會將操作符兩側的字符值進行級聯。通常會使用賦值語句將級聯操作的結果存儲在結果變量中。如果事先沒有通過LENGTH或ATTRIB語句指定該結果變量的長度,則其長度為在級聯操作中每個變量或常量的長度總和。級聯操作不會去除操作數的前導和尾綴空格。如果變量帶尾綴空 格,在級聯前使用TRIM函數可去除值中的尾綴空格。如果要去除操作 數的前導和尾綴空格,通常使用表達式TRIM(LEFT(char))。
(5)WHERE語句操作符
在WHERE語句或數據集選項WHERE=中使用的表達式稱為WHERE表達式。在WHERE表達式中除了可以使用上述操作符之外,還 可以使用如下表的操作符。注意,這些操作符只能在WHERE表達式中使用。
(6)MIN、MAX操作符
MIN(><)和MAX(<>)操作符分別用於找到兩個操作數中的最 小值和最大值。例如,如果A<B,那么A><B的返回值為A,A<>B的返 回值為B。如果比較中包含缺失值,SAS使用缺失值的排序順序。
注意,在WHERE語句或WHERE從句中,<>操作符等同於NE。
3.復合表達式求值
僅包含一個操作符的表達式為簡單表達式。為了表示復雜的邏輯或 操作,表達式中通常會包含多個操作符,這樣的表達式稱為復合表達 式。復合表達式中經常使用括號對操作數進行分組。當遇到復合表達式 時,SAS會遵循下述規則確定計算表達式各部分的順序:
·如果復合表達式中有括號,SAS會先對在括號中的表達式求值,再 對括號外的表達式求值。
·下表中給出了不同組的優先級。SAS先對組Ⅰ中的表達式部分求 值,然后依次對組Ⅱ、組Ⅲ等組求值。
·下表也給出了同組內的求值順序。對組Ⅰ中的操作符是從右到 左,而其他組的操作符都是從左到右。
復合表達式求值順序
①NOT、NE、OR以及組IV中的級聯符號取決於當前操作環境。