《SAS編程與數據挖掘商業案例》學習筆記之十二
本次重點在:sas數據集管理
主要包含:包含數據集縱向拼接、轉置、排序、比較、復制、重命名、刪除等
1.append語句
註:base數據集和data兩個數據集必須結構一樣。避免使用force的情況,反復append的會造成反復。
一個避免反復的商業化應用:
%macro dl;
%if %sysfunc(exist(null)) ne 0 %then %do;
proc datasets lib=work nolist;
delete null;
quit;
%end;
proc append base=null data=sashelp.class;run;
%mend dl;
%dl;
假設數據集null存在,則進行刪除,否則直接append
還有一個使用的樣例;
data _null_;
x=today();
format x yymmdd10.;
call symput(‘data_month‘,put(intnx("month",x,0),yymmn6.));
run;
%put &data_month;
data a;
input month$ var;
cards;
200908 10
200909 20
200910 30
200911 40
;
data b;
input
cards;
200911 400
;
data a;
modify a;
if month="&data_month" then remove;
run;
proc append base=a data=b;run;
第一部分:獲取當前月
第二部分:刪除當前月數據
第三部分:append到數據a
當中第二部分能夠用下面兩個語句替代,可是效率最高的是remove。效率最低的是sql。
data a;
set a;
if month="&data_month" then delete;
run;
proc sql;
delete from a
where month="&data_month";
quit;
2.sort語句
經常使用選項:
nodupkey:刪除反復by值相應的觀測
noduprecs:刪除反復觀測值
Descending 一定要放在降序排序的變量前。
Eg:
data a;
input x y @@;
cards;
1 20 1 10 1 30 2 40 2 50
;
run;
proc sort data=a nodupkey; by x;run;
僅僅取排序變量的每個by組的第一條觀測值
上述代碼也能夠用下面取代:
proc sort data=a ; by x;run;
data b;
set a;
by x;
if first.x;
run;
返回每個by組裏面y最小的。
proc sort data=a; by x y;run;
proc sort data=a nodupkey; by x;run;
也能夠用data步完畢:
proc sort data=a; by x y;run;
data b;
set a;
by x y;
if first.x;
run;
註:假設使用了nodupkey選項。最好使用out=選項,否則原有數據集會被刪除掉一部分。
對於多個字符變量須要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;
下面代碼也能夠運行,可是效率低
proc sort data=a out=b;
by x1-x3;
run;
proc sort data=a ;
by x1-x3;
run;
3.轉置transpose過程
proc transpose data= chapt6.score out= chapt6.idnumber name=test prefix=sn;
id studentid;
idlabel student;
run;
註:轉置的變量為全部的數值型變量,包含test1、test2、final
對於默認的變量名用studentid取代,並加入前綴sn
對於默認的轉之前變量名列轉置後的列名_name_改為test,
轉置後的變量添加student值
eg:
proc transpose data= chapt6.fishdata
run;
by組中的4個變量length1-length4進行轉置。系統每讀取一條by觀測。轉置後將產生4條觀測
data chapt6.fishlength2;
set chapt6.fishdata(keep=location date length1-length4);
array tr[1:4] length1-length4;
do i=1 to 4;
measurement=tr(i);
output;
end;
keep location date measurement;
run;
通過data語句實現上面的轉置過程
proc transpose data= chapt6.fishlength
id _name_;
run;
列轉成行
data chapt6.fishdata3;
do i=1 to 4;
set chapt6.fishlength(keep=location date measurement);
array tr[1:4] length1-length4;
tr(i)=measurement;
end;
keep location date length1-length4;
run;
通過data步驟實現列轉成行
4.datasets過程
見sashelp
《SAS編程與數據挖掘商業案例》學習筆記之十二