1. 數據來源
SAS數據來源主要有兩種:一是通過input語句創建,另外一種方式是通過外部數據文件獲取。
1.1 libname
1.2 odbc
1.3 passthrough
1.4 import
1.5 input
該方式是在SAS系統下通過input語句輸入SAS數據塊,實踐中是最不常的用的一塊。
2. set語句
從一個或者多個SAS數據集中讀取觀測值並實現縱向合並。
2.1 keep=選項
data keep; set sashelp.class(keep = age sex); run;
該方式創建了一個臨時數據集keep(輸出數據集),然后使用set語句從數據集sashelp.class中獲取數據,keep=指定了讀入的變量,其他冗余變量不讀取,最后將讀取的變量輸入到數據集keep中。
還可以輸出兩個或者多個數據集:
data d1(keep=name)d2(keep=name sex); set sashelp.class(keep=name sex); run;
輸出數據集d1和d2,並且分別在每個數據集后使用keep=指定了輸出的變量。在set語句中使用keep=語句,可以提高運行效率,因為它使得set語句從數據集class中只讀取了name和sex兩個變量到PDV中。去掉這里的keep=不會報錯,但是效率會降低。進一步,如果將這里的keep修改為“keep=name”,即去掉sex,那么導致的結果是數據集d2中只包含name變量,而不包含sex變量,這是因為set語句沒有讀取sex變量,自然不會輸出到d2中。
2.2 rename=選項
將變量名重新命名:
data rename; set sashelp.class(keep = name sex rename=(name=name_new sex=sex_new)); run;
對重命名變量需要用括號括起來。
2.3 where表達式
添加篩選條件:
data where; set sashelp.class(keep=name sex where=(sex='男')); run;
讀取性別為男的人的姓名和性別。可以通過keep=的方式只輸出性別為男的人的姓名,只需要將第一行修改為“data where(keep=name);”即可。注意,不能通過去掉class后面的sex實現,因為這里的keep指定的是讀取變量,否則讀取不到sex就無法完成where后的sex條件判斷,就會報錯。
2.4 in選項
把set語句后面不同的數據集通過標識變量顯示出來:
1 data one; 2 input x y$ @@; 3 cards; 4 1 a 2 b 3 c 5 ; 6 data two; 7 input x z$ @@; 8 cards; 9 4 d 5 e 10 ; 11 12 data in1; 13 set one(in=ina) two(in=inb); 14 in_one = ina; 15 in_two = inb; 16 run;
如果一行的觀測來源於數據集one,那么對一個的in_one的值是1,in_two的值為0.相反,如果該行觀測來源於數據集two,那么in_one的值為0,in_two的值為1.簡單來說,就是標識一下該行變量來源。
in本身不是個變量,所以不能通過in_one=in的形式得到標識變量,於是就先創建一個臨時變量ina,然后把臨時變量的值賦給輸出變量in_one。
還可以通過if語句實現標記:
1 data in2; 2 set one(in=ina) two(in=inb); 3 if ina=1 then flag=1;else flag =0; 4 run;
in選項可以標記觀測的來源,那么就可以使用in選項對不同來源的數據進行不同的操作。
2.5 firstobs=和obs=
讀取數據集中指定行到行的觀測:
1 data obs; 2 set sashelp.class(firstobs=3 obs=5); 3 run;
讀取class數據集中第3行到第5行的數據,包括第3和第5行。firstobs和obs都可以缺省,如果缺省firstobs代表默認為從第一個開始到obs指定的行,如果缺省obs,則代表默認為從firstobs指定的行到最后位置。兩者都缺省,實質上就是未指定范圍,即讀取全部觀測。
2.6 nobs=
2.7 point=
2.7.1 取指定的一條觀測
1 data point1; 2 n=3; 3 set sashelp.class point=n; 4 output; 5 stop; 6 run;
讀取第3條觀測,注意point=后邊必須跟變量,如果直接寫成point=3是錯誤的。使用output輸出第3條觀測,使用stop終止運行。注意,如果沒有output則不能將觀測輸出到數據集中,如果沒有stop會使程序陷入死循環,數據指針無法判斷是否指向了最后一條觀測。stop經常和point搭配使用。
2.7.2 取指定的多條觀測
1 data point2; 2 do n=2,4,6,7; 3 set sashelp.class point=n; 4 output; 5 end; 6 stop; 7 run;
output與end的位置不能互換,互換后只輸出最后一條觀測,即第7條觀測。
2.8 nobs=和point=綜合應用
快速讀取最后一條觀測:
1 data nobs_point; 2 set sashelp.class nobs=last point=last; 3 output; 4 stop; 5 run;
2.9 end=
文件是否結尾的標識:
1 data end; 2 set sashelp.class end=last_obs; 3 flag = last_obs; 4 run;
2.10 具有相同數據結構的多個數據集的合並
1 data concatenat; 2 set sashelp.class sashelp.class(obs=10); 3 run;
2.11 使用output控制輸出到多個數據集
1 data d1 d2; 2 set sashelp.class; 3 if _n_ le 10 then output d1; 4 else output d2; 5 run;
_N_表示當前數據指針指向的行。output指定輸出的數據集。另外注意,SAS中的if語句不帶end。