首页 > 代码库 > 《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  month$ var;

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;

注:转置的变量为所有的数值型变量,包括test1test2final

对于默认的变量名用studentid代替,并添加前缀sn

对于默认的转之前变量名列转置后的列名_name_改为test

转置后的变量增加student

 

eg

proc transpose data= http://www.mamicode.com/chapt6.fishdata

   out= chapt6.fishlength(rename=(col1=measurement));

   var length1-length4;

   by location date;

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

   out= chapt6.fishdata2;

   var measurement;

   by location date;

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编程与数据挖掘商业案例》学习笔记之十二