data one; input x y $ @@; cards; 1 a 2 b 3 c ; data two; input x z $ @@; cards; 4 d 5 e ; data in1; set one(in=ina) two(in=inb); in_one=ina;/*此處我本身的理解是這樣的:前一行括號中的ina是本身定義的一個標識,表示對應的觀測值在不在數據集中*/ in_two=inb;/*此時將ina和inb賦值給in_one和in_two並在數據集in1中顯示*/ run; 數據集in1結果以下: x y z in_one in_two 1 a 1 0 2 b 1 0 3 c 1 0 4 d 0 1 5 e 0 1IN=是一個很是重要的SAS數據集選項,它能夠把SET語句後面不一樣的數據集經過標識變量顯示出來。可是因爲IN自己不是變量,所以不能直接經過賦值語句如in_one=in 獲得標識變量,而只能先在PDV裏面建立一個臨時變量(該例是ina和inb),而後把臨時變量的值賦給輸出變量(該例對應的是in_one和in_two)。固然,不必定非要建立輸出變量。如:
data in2; set one(in=ina) two(in=inb); if ina=1;then flag=1;else flag=0; run;
x y z flag 1 a 1 2 b 1 3 c 1 4 d 0 5 e 0
IN=選項的做用在於經過標識輸入數據集,達到對不一樣輸入數據集執行不一樣條件操做的目的。 java
<2>固然SET語句的選項還有好多,例如常常用到的選項是KEEP=,RENAME=,WHERE=,FIRSTOBS=,OBS=,NOBS=,POINT=,END=選項,可是這些都不是很難理解,只有上邊的IN=選項費了我一點時間,我將個人理解和例子寫上去了,但願能夠幫助到你。下邊簡單介紹一下後邊的幾個選項應用: 數組
KEEP=:指定的變量(組)進入到PDV,即最終數據集中保存下來的數據。 函數
RENAME=:重命名選項,知識須要對重命名變量用括號括起來。 spa
WHERE=:和SQL的where同樣,條件篩選語句,只是要對錶達式用括號括起來。 指針
FIRSTOBS=:讀取數據集中的觀測值開始位置。如:FIRSTOBS=3說明讀取數據集的第三條觀測做爲開始觀測。 code
OBS=:指定讀取數據集中的觀測值的結束位置。同上。 排序
NOBS=:對應的是數據集的觀測數,即數據集中數據的總條數。 索引
POINT=:取指定的一條數據。(注意SAS中數組或者數據,開始的第一條是1而不是0)。 開發
END=:標識文件是都結尾。一般這樣用:end=last_obs; input
2.BY
BY語句在過程當中通常用來指定一個或幾個分組變量,根據這些分組變量值把觀測分組,而後 對每一組觀測分別進行本過程指定的分析。在使用帶有BY語句的過程步以前通常先用SORT過 程對數據集排序。
3.MERGE
merge語句能夠實現多表的橫向合併。從功能實現的角度,若是是一對1、多對一或一對多的關聯,merge語句和SQL基本上是同樣的。可是對於多對多的關聯,二者有很大的差異。在實際操做中,多對多的狀況是須要用SQL實現的。
注意:
【1】對須要用到BY語句的merge,merge後面全部表在merge以前都須要排序。
【2】相對於SET語句,IN=選項在merge語句中應用更普遍。
【3】BY語句後面的變量必須是merge語句後面全部數據集共同變量,因此有時候須要對錶中的變量重命名。
【4】在匹配合並中,若是merge後一個數據集出現空值,則空值也會覆蓋前一個表的值。
4.KEEP
KEEP=選項保證在讀入數據集時只有KEEP=後面的變量進入PDV,而數據集其餘全部變量將不會進入PDV。
例子:
data a1; data a2;
set sashelp.class(keep=_character_); set sashelp.class(keep=_numeric_);
run; run;
此程序將保留數據集class全部字符型變量。 此程序將保留數據集class全部數值型變量。
還能夠用下邊的形式,來建立多個數據集,保留不一樣的變量:
data a3(keep=name) a4(keep=weight);
set sashelp.class;
...;
run;
此程序通過DATA步一系列操做以後,輸出兩個數據集:a3只有name變量;a4只有weight變量。
5.DROP
DROP語句是KEEP語句的反向聲明語句,規定輸出數據集中要刪除的變量,同KEEP同樣,對DATA步中正在建立的全部SAS數據集都適用。
DROP語句有以下兩個重要的功能:
<1>讀入數據集用DROP=選項效率高於DROP語句。
<2>既能夠刪除變量列表,也能夠在輸出數據集中刪除不一樣變量。
6.SORT
SORT對數據集中的觀測排序。對數據集進行合併和更新等在使用前必須通過對BY變量進行排序。
<1>經常使用選項說明:
DATA=:規定被排序的數據集,默認爲最新建立的數據集。
OUT=:建立輸出數據集,省略該選項時用排序後的數據集替換原數據。
EQUALS;保持BY組內的排序。
NOEQUALS:容許BY組內順序變化。
NODUPKEY:刪除重複BY值對應的觀測。
NODUPRECS:刪除重複觀測值。
FORCE:刪除實施多餘排序。排序並替換原來加索引或取子集的數據集;在沒有規定OUT=選項時,在下列狀況下應該使用FORCE選項:數據集有索引、使用了OBS= 和FIRSTOBS=選項、使用DATA=規定被排序數據集時使用了WHERE選項、PROC SORT中使用了WHERE選項。
BY:PROC SORT中必須使用BY語句,BY語句中能夠指定一個或多個變量。默認時升序排序。可使用DESCENDING對變量進行降序排序,可是要注意DESCENDING必定
要放在降序變量以前。
<2>在商業實踐中,最經常使用的就是兩個選項。OUT和NODUPKEY。注意幾點:
【1】若是使用了NODUPKEY選項,最好使用OUT=選項。不然原有數據集會被 SORT後NODUPKEY刪除掉一部分觀測,萬一程序開發有誤,又要從新生成原來的數據集。而使用OUT=選項能夠保證原來的數據集不變,把NODUPKEY後產生的觀測輸出到新的數據集中。
【2】若是有多個字符型變量須要SORT,則在SORT以前使用諸如CATT之類的字符拼接函數拼接全部須要SORT的字符變量,而且最好使用OUT=選項,以提升程序運行效率。
例子:
data a; length cat $100; input x1 $ x2 $ x3 $ y; cat=catt(of x1-x3); cards; a1 b1 c1 1 a2 b2 c2 2 ; run; proc sort data=a out=b; by cat; run;7.SUMMARY PROC SUMMARY = PROC MEANS;