SAS编程数据挖掘学习与帮助文档-3_第1页
SAS编程数据挖掘学习与帮助文档-3_第2页
SAS编程数据挖掘学习与帮助文档-3_第3页
SAS编程数据挖掘学习与帮助文档-3_第4页
SAS编程数据挖掘学习与帮助文档-3_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、SAS编程与数据挖掘商业案例学习笔记之九(2013-08-07 07:41:14) 转载标签: sasinfile语句数据挖掘数据分析sas编程分类: SAS编程 继续之前的读书笔记,废话少说,直奔主题。本文重点在infile语句。十一:infile语句Dsd 规定一个数据集可以包含分隔符,但是要用引号括起来,两个连续分隔符之间的数作为缺失值处理, 默认分隔符为逗号Firstobs= 规定从该记录行开始读入Obs= 规定要读入的记录数Length= virable 把当前行的数据长度赋值给临时变量variableMissover 阻止input语句从下一数据行读入数据,为赋值的变量设置为缺失e

2、g:filename file 'f:data_modelbook_datachapt3utf.txt'data unicode;infile file encoding="utf-8"input name $ weight;run;导入指定编码格式的文件eg:data num;infile datalines dsd dlm=''input x y z;datalines;2 34 5 67 9;run;对于有缺失值时,利用dsd 和dlm一起可以解决eg:data weather;infile datalines missover;inp

3、ut temp1-temp5;datalines;97.9 98.1 98.398.6 99.2 99.1 98.5 97.596.2 97.3 98.3 97.6 96.5;run;第一行后面两个数据缺失,此时用missover强制数据指针必须读完每一行对应的所有输入变量的值SAS编程与数据挖掘商业案例学习笔记之十(2013-08-07 12:57:22) 转载标签: sas数据分析retain语句keep语句array语句分类: SAS编程 继续之前的读书笔记,本次讲解sas主要的变量操作,包括基本赋值语句、累加语句、keep语句、retain语句、array语句、rename语句、len

4、gth语句。1.基本赋值语句z=x y;z=sum(x,y); sum函数的好处是可以克服缺失值的影响;2.如果表达式中既有数值型变量又有字符型变量的话,则会将字符型变量转化为数值型变量3.系统在编译阶段,对于赋值语句变量,如果是字符型变量则长度为1,如果是数值型变量则长度为8,接下来,系统将执行赋值语句,这时变量长度将由第一次读入的表达式的运算结果决定。一旦第一次读入确定长度之后,下一次pdv无论读入多长的数据,都不会改变变量的长度。除非提前用length语句限定变量的长度。4.累加语句x 1,x (-1)都是累加语句,其中x必须是数值型变量,在编译阶段,pdv自动设置累加变量值为0,它的值

5、从当前执行后一直保留在pdv中,直到下一次执行为止。在项目实践中,一般用retain语句替代累加语句,因为retain语句可以初始化累加变量为一个非零值,而累积语句初始值只能为0.5.keep语句(keep语句不是可执行语句)Data a3;set sashelp.class(keep=name weight);x=1;keep name x;Run;Data a4(keep=name x);set sashelp.class(keep=name weight);x=1;Run;以上两个程序输出结果一样,但是对于读入数据集时,keep=的形式性能要远高于keep的形式,因为keep=的形式是仅

6、限后面的变量进入pdv,对于拥有几百个变量的数据集而言,keep=效率要高;不过对于数据输出方面,keep=与keep性能没有区别;上面两个语句性能完全一样。6.retain语句(不是一个可执行语句)pdv运行规律:data语句与run语句构成了一个循环语句,一般情况下每读一遍data步所有语句时,pdv都会清空所有变量值,并设置为缺失值。然后根据执行语句,再次对变量进行赋值。当data步使用retain语句时,pdv则不会清空retain语句对应变量,而是一直保留直到下次该变量再次执行。retain语句在data步中有着广泛的应用,对于数据集的操作可以到单元格,而一般函数只能操作到列,实际应

7、用中retain会使程序更加灵活化。可以控制一个变量的值不变,除非有外部的条件的变化而变化。retain语句主要实现以下需求:汇总数据,累加变量,纵向比较变量,创建flag标识变量,处理缺失值,迭代累加字符变量值。Eg:关于汇总数据的一个例子(按照每个id,汇总cns的值,汇总id的记录数,如果txn_cde变量取101和201两个值,则累加计算一次,计算txn_dte的最小值,)libname chapt4 "f:data_modelbook_datachapt4"data chapt4.retain1;input id txn_cde$ cns txn_dte$;car

8、ds;10 101 10 2007010110 101 20 2008040210 201 30 2005020320 101 40 2004010520 201 50 2004010520 301 60 2007080620 201 70 2005060730 301 80 2007050130 401 90 20070306;run;proc sort data= chapt4.retain1;by id txn_dte;run;data test1;set chapt4.retain1;by id txn_dte; - 按照id txn_dte排序后逐条读取数据retain min_dt

9、e sum_cns cnt cnt_condition;if first.id then do; -由于赋值语句比较多,需要用do语句套住所有的赋值语句,不是循环。min_dte=txn_dte;sum_cns=0;cnt=0;cnt_condition=0;end;min_dte=min(min_dte,txn_dte);sum_cns cns;cnt 1;cnt_condition (txn_cde in("101" "201");if last.id; -只有每次id对应数据读完后才会执行此举。run;整个程序分为5个模块,Set/by模块:set

10、语句是读数据集,必不可少,一定注意by语句不能丢,by后面的变量就是之前排序中的变量。retain模块:对需要retain的变量进行声明first模块:对retain变量按照每一个first.id做初始化主体模块:该模块介于first与last之间,主要是完成对需求的运算last模块:该模块主要完成最后的输出。7.array语句array在sas中其实是一个变量指针,他真用内存空间约4B,其作用是指向需要操作的变量对象,array可以把无序的无规则的变量名统一,常用的array语句:Array rain5 x1-x5; 数组中有5个元素,分别为x1-x5Array ar(3); 输出变量默认为

11、ar1-ar3Array ar(1:3) 等价于上一个Array x1:5,1:3 score1-score15; 规定一个5*3二维数组,score1-score15一次逐行放入数组Array ab(*) x y z; 等价于array ab(3) x y z;Array test(3) _temporary_ (90 80 70)Array days7 d1-d7 (1,2,3,4,5,6,7);数组函数:维度函数dim(),array mult 5,10,2 mult1-mult100,dim(mult)=dim(mult,1)=5Dim2(mult)=dim(mult,2)=10Dim

12、3(mult)=dim(mult,3)=100Eg:options pageno=1 nodate ps=64 ls=80;data temp;input x ;cards;10 20 30;run;data test (drop=i);set temp;array a(5) A1-A5;do i=1 to 5;a(i)=i;end;run;proc print noobs data=test;run;总结:array其实是一个横向操作语句,也就是说,当数据指针停留在某一条观测时,可以通过array语句,把所有的array声明的变量都操作一遍。商业实战:缺失值的填充;data missing;

13、input x y$ z$ m;cards;. . . 12 . 3 .;run;data result;set missing;array char _character_;array numr _numeric_;do over char;if char eq "" then char="null"end;do over numr;if numr eq . then numr=0;end;run;对于所有的字符型变量。缺失时都赋值为null。对于所有的数字型变量,缺失事都赋值为0常见累加器,比如统计价格人数data score;input id$ x

14、 y z;cards;a 75 84 65b 54 74 71c 51 56 52d 50 50 60;run;data qualify;set score;k=0; array chengji(3) x y z;array base(3)_temporary_(60,60,60);do i=1 to 3;if chengji(i) ge base(i) then k 1; end;if k=3 then output qualify;run;统计所有成绩都及格的学生记录。横向排序变量data a;input x1-x7;cards;23 44 81 13 42 34 2614 18 10 2

15、0 33 11 50;run;data final;set a;array arr(1:7) x:;array copy(1:7) cx1-cx7;do m=1 to dim(arr);copy(m)=arr(m);end;do i=1 to dim(copy);do j=i 1 to dim(copy);if copy(j)>copy(i) then do;temp=copy(j);copy(j)=copy(i);copy(i)=temp;end;end;end;run;利用冒泡算法实现横向排序纵向横向综合应用:删除缺失值比例超过一定阈值的变量列表:options symbolgen;

16、data missing;input n1 n2 n3 n4 n5 n6 n7 n8 c1$ c2$ c3$ c4$;datalines;1 . 1 . 1 . 1 4 a . c .1 1 . . 2 . . 5 e . g h1 . 1 . 3 . . 6 . . k l1 . . . . . . . a b c d;data _null_;if 0 thenset missing nobs=obs;array num_vars* _NUMERIC_;array char_vars* _CHARACTER_;call symputx('num_qty', dim(num_v

17、ars);call symputx('char_qty', dim(char_vars);call symputx('m_obs',obs);stop;run;%put &num_qty &char_qty &m_obs;data _null_;set missing end=finished;array num_vars* _NUMERIC_;array char_vars* _CHARACTER_;array num_miss &num_qty (&num_qty * 0);array char_miss &c

18、har_qty (&char_qty * 0);length list $ 50;do i=1 to dim(num_vars);if num_vars(i) eq . then num_miss(i) 1;end;do i=1 to dim(char_vars);if char_vars(i) eq '' then char_miss(i) 1;end;if finished then do;do i= 1 to dim(num_vars);if num_miss(i)/&m_obs. ge 0.7 then list=trim(list)|' 

19、9;|trim(vname(num_vars(i);end;do i= 1 to dim(char_vars);if char_miss(i)/&m_obs. ge 0.7 then list=trim(list)|' '|trim(vname(char_vars(i);end;call symputx('mlist',list);end;run;%put &mlist;data notmiss;set missing(drop=&mlist);run;这是一个典型的array语句和retain语句综合应用的例子第一个_null_程序,区

20、分并计算所有数值型和字符型变量的个数,并把结果赋值给两个不同的宏变量;同时获取数据集missing的观测数,也赋值给另外一个宏变量m_obs;整个程序都是在编译阶段完成的,没有任何的执行语句,这是为了提高效率,第二步,对数值型和字符型分布计算每一个变量的缺失值个数,并累加,最后根据预设的阈值,找到满足的所有变量,并赋值给宏变量mlist第三步:data步,drop满足条件的变量。第二步说明“:编译过程声明了四个数组,num_vars指向所有的数值型变量(n1-n8),使用_numeric_故不再输出数据集中显示char_vars指向所有的数值型变量(c1-c8),使用_character_故不

21、再输出数据集中显示数组num_miss,默认变量名是num_miss1-num_miss8,并设置初始值为0;数组char_miss,默认变量名是char_miss1-char_miss8,并设置初始值为0;接下来程序读取数据集missing第一条观测,执行两个do语句,第一个do语句,获得num_miss1=0,num_miss2=1,num_miss8=1第二个do语句,获得char_miss1=接下来,判断if finished语句,由于还没有读到文件末尾,所以程序不会执行该语句,直接run语句,输出第一条观测,程序调回data开头,继续执行下一个观测,依次下去,知道最后一条记录。然后执

22、行if finshed语句,完成最后两个do语句:第三个do语句,执行8次,如果缺失值超过70%,则执行list=trim(list)|' '|trim(vname(num_vars(i),从而获取全部的缺失值大于70%的数值型变量;第四个do语句,同样的道理最后总结,array语句在处理横向操作方面功能非常庞大,只要有array出现的地方,就要有do语句,8.rename语句Rename old_name=new_name;注意:rename语句是一个声明语句,不是赋值语句rename语句如果和keep语句同时出现的时候,系统先编译keep语句,后编译rename语句。dro

23、p类似于keep语句。eg:data a;input x y;cards;1 2;data b;set a;rename y=yy;keep x y;run;9.length语句Length m1 3 m2 $8;Length m1 m2 7;都是合法的length语句可以改变原有数据集变量的长度。对于字符型变量,语句要在set语句之前,对于数值型变量,可以在任何地方,10.label语句Label x1='ab' x2='cd'SAS编程与数据挖掘商业案例学习笔记之十一(2013-08-07 18:10:27) 转载标签: sasoutput语句sas编程pd

24、vwhere和if语句分类: SAS编程 继续读书笔记,本文重点侧重sas观测值的操作方面, 主要包括:输出观测值、更新观测值、删除观测值、停止输出观测值等1.output语句 输出当前在pdv中的观测值,继续无条件执行下面的语句。注意:简单的data步不需要output语句,run语句会自动输出pdv中的数据到数据集,并返回data步开头继续执行下一条观测。在有output语句和run语句同时存在时,pdv只会执行output的结果到正在被创建的数据集,而执行run语句的结果是pdv会清空所有的变量值为缺失值data a;input id x1-x3;cards;101 10 20 3010

25、2 40 50 60;data b;set a;x=x1;output;x=x2;output;x=x3;output;output;run;由于data步包含四个output语句,因此每次读入一条观测,程序会执行output语句,总共会输出8条记录data out1 out2;set sashelp.class;if _n_ le 7 then output out1;else output out2;run;if条件的output语句,只有满足if条件时pdv才把得到的结果输出到正在被创建的数据集data a;input x y ;cards;1 10 1 20 1 200 2 30 2

26、403 50 3 60 4 70 3 80 4 400;proc sort data=a;by x;run;data b;set a;by x;retain rt;if first.x then rt=0;if last.x then output;rt=y;run;输出by变量的last观测值,并保留last最近前一条观测变量值。该例中output与run同时出现时,值输出output后面的,不管output前面的条件是否成立;执行run语句的结果是PDV会清空所有的变量值为缺失。是对每一个by组进行循环的,且first.x也是针对by组的2.if语句 是一个可执行语句,将满足条件的观测值输

27、出到正在被创建的数据集中3.where语句 不是一个可执行语句,判断条件是在pdv之前注:不能使用自动变量_n_或者其他选项如obs,point与where语句一起使用。因为where语句是在pdv之前使用where语句必须保证读入数据集的完整性,不能使用如firstobs=2等不能完整读入数据集的选项对同一数据集,同时使用where语句和where=选项,则系统只使用where=选项,而不考虑where语句where语句和by语句一起出现时,先执行where语句,然后在by语句,by组对执行完毕后的数据集重新定义first/lastWhere语句和if语句 区别1.where语句是在观测进入

28、pdv之前起作用,而if语句是在pdv中的观测起作用。2.where语句不是一个可执行语句,而子集if语句是可执行语句3.where语句有自己特有的表达式,而if语句使用通用的sas表达式4.where语句比if效率高4.replace语句和remove语句和output语句这两个语句只能跟modify一起使用,数据集:libname chapt5 "f:data_modelbook_datachapt5"data chapt5.a;input x y ;cards;1 10 2 20 3 30 4 40;run;libname chapt5 "f:data_mo

29、delbook_datachapt5"data chapt5.b;input x y ;cards;3 300 4 400 5 500;run;eg:data chapt5.a;modify chapt5.a chapt5.b;by x;if _iorc_=0 then replace;else _error_=0;run;对匹配到的数据,更新数据集将覆盖主数据集,对于未匹配到的数据,不予考虑data chapt5.a;modify chapt5.a chapt5.b;by x;if _iorc_=0 then replace;else do; _error_=0;output;en

30、d;run;对匹配到的数据,更新数据集将覆盖主数据集,对于未匹配到的数据,将更新数据集数据也输出到主数据集中data chapt5.a;modify chapt5.a chapt5.b;by x;if _iorc_=0 then remove;else _error_=0;run;对于匹配到的数据从主数据中删除5.delete语句和stop语句data a;set sashelp.class;if sex eq "M" then delete;run;删除部分观测,以下代码目的一样data a;set sashelp.class;if sex ne "M"

31、;run;data a;set sashelp.class;if _n_ ge 3 then stop;run;stop直接跳出data,最终数据集a只有两条观测SAS编程与数据挖掘商业案例学习笔记之十二(2013-08-07 21:21:30) 转载标签: sasappend语句transpose语句sort语句数据挖掘分类: SAS编程 本次重点在:sas数据集管理 主要包括:包括数据集纵向拼接、转置、排序、比较、复制、重命名、删除等1.append语句注:base数据集和data两个数据集必须结构一样,避免使用force的情况,重复append的会造成重复。一个避免重复的商业化应用:%m

32、acro 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

33、),yymmn6.);run;%put &data_month;data a;input month$ var;cards;200908 10200909 20200910 30200911 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=b;run;第一部分:获取当前月第二部分:删除当前月数据第三部分:append到数据a其中第二部分可以用以下两个语句替代,但是

34、效率最高的是remove,效率最低的是sql。data a;set a;if month="&data_month" then delete;run;proc sql;delete from awhere 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 dat

35、a=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之类的字符拼接函数拼

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论