首页 > 代码库 > 《SAS编程与数据挖掘商业案例》学习笔记之十二
《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=http://www.mamicode.com/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=http://www.mamicode.com/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=http://www.mamicode.com/a nodupkey; by x;run;
只取排序变量的每一个by组的第一条观测值
上述代码也可以用以下代替:
proc sort data=http://www.mamicode.com/a ; by x;run;
data b;
set a;
by x;
if first.x;
run;
返回每一个by组里面y最小的,
proc sort data=http://www.mamicode.com/a; by x y;run;
proc sort data=http://www.mamicode.com/a nodupkey; by x;run;
也可以用data步完成:
proc sort data=http://www.mamicode.com/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=http://www.mamicode.com/a out=b;
by cat;
run;
以下代码也可以执行,但是效率低
proc sort data=http://www.mamicode.com/a out=b;
by x1-x3;
run;
proc sort data=http://www.mamicode.com/a ;
by x1-x3;
run;
3.转置transpose过程
proc transpose data= http://www.mamicode.com/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= http://www.mamicode.com/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= http://www.mamicode.com/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编程与数据挖掘商业案例》学习笔记之十二