SAS編程基礎 - 數據獲取與數據集操作(1)


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM