SAS编程数据挖掘学习与帮助文档2.docx
《SAS编程数据挖掘学习与帮助文档2.docx》由会员分享,可在线阅读,更多相关《SAS编程数据挖掘学习与帮助文档2.docx(15页珍藏版)》请在冰点文库上搜索。
![SAS编程数据挖掘学习与帮助文档2.docx](https://file1.bingdoc.com/fileroot1/2023-5/31/3513512a-86d4-462b-ac36-baf552470282/3513512a-86d4-462b-ac36-baf5524702821.gif)
SAS编程数据挖掘学习与帮助文档2
《SAS编程与数据挖掘商业案例》学习笔记之五
(2013-07-3120:
39:
22)
转载▼
标签:
sas
数据挖掘
应用案例
学习笔记
merge语句
分类:
SAS编程
六:
merge语句的使用(一个指针,一个pdv)
merge语句是横向合并数据集,合并前必须两个数据集都要按照合并变量进行排序;
procsortdata=chapt3.merge_a;byx;run;
procsortdata=chapt3.merge_b;bybx;run;
dataed;
mergechapt3.merge_a(in=a)chapt3.merge_b(rename=(bx=x)in=b);
byx;
Ina=a;inb=b;
run;
以两个数据集的x变量为关键表链两个表相连,由于两个表中都有一个y变量,由于同名b表中的y会覆盖对应匹配到的a中的y的值;
七:
update语句(一个指针,一个pdv)
update在横向合并两个数据集时的方式和merge相似,都是用更新数据集修改主数据集。
procsortdata=chapt3.merge_a;byx;run;
procsortdata=chapt3.merge_b;bybx;run;
dataed;
Updatechapt3.merge_achapt3.merge_b(rename=(bx=x));
byx;
run;
update语句一定要和by语句一起;这个by语句给出了主数据集和更新数据集共有的变量;
update语句必须先对数据集按照by后面的变量进行排序;
主数据集中by后面指定的变量对应的观测值最好是唯一的,因为如果不唯一,则只会替代第一个记录;
更新数据集存在的缺失值处理是通过updatemode来完成的,updatemode=missingcheck,则检查修改数据集,若存在缺失值,则保留主数据集中相应数据,该选项为默认值;
Updatemode=nomissingcheck,不检查修改数据集,主数据集中相应值一概被替换
《SAS编程与数据挖掘商业案例》学习笔记之六
(2013-07-3123:
59:
59)
转载▼
标签:
sas
数据挖掘
modify语句
学习笔记
分类:
SAS编程
八:
modify语句((一个指针,两个pdv))
merge语句和update语句对数据集横向合并的主要功能还只能体现在匹配访问上,如通过by语句,对每个by组中的匹配数据集进行修改或更新,对于非常庞大的数据集需要定期更新,并且每次更新的观测对象是动态的时候,merge和update会消耗更多的资源,而是用modify可以通过高效的访问机制来实现这个需求。
四种语法:
1.匹配访问
Datamaster_data;
modifymaster_datetransaction_data;
…;
byvariable;
Run;
注:
除非使用output语句,否则data步后面只能接一个数据集,并且modify后面的第一个数据集必须和data步后面的数据集同名;
by语句对应的是标识变量,不同于merge和update中的by语句对应的变量需要排序
主数据集对应by变量的消除重复值后的集合应该包含更新数据集对应的by变量消除重复值猴岛集合;
主数据集有重复时只更新第一条,更新数据集中有重复值时,最后一条起更新作用。
2.索引访问
Datamaster_data;
settransaction_data;
modifymaster_datakey=variable;
…..;
Run;
注:
更新数据集在主数据集没有找到主数据集key=对应的变量值,系统会设置自动变量_error_值为1,并在日志报错中显示该变量,
索引访问和匹配访问的不同点:
匹配访问中更新数据集同名变量会自动覆盖主数据集;索引访问会被当做不同的变量;
对于更新数据集出现by重复值的处理,索引访问会报错并终止程序,不过可以通过unique来纠正。
3.观测序号访问
Datamaster_data;
settransaction_data;
modifymaster_datapoint=variable;
…;
Run;
如果更新数据集在主数据集中没有找到point=对应的变拉直,系统会自动设置自动变量_error_的值为1,另外point=有可能陷入死循环,需要配合stop使用。
4.顺序访问
Datamaster_data;
modifymaster_data;
…;
Run;
注:
关于自动变量_iorc_,当运行modify语句时,_iorc_变量自动生成,包含系统每次运行modify语句时返回的I/O操作码,以匹配访问为例,如果主数据集by变量值在更新数据集中存在,自动变量_iorc_返回0,如果主数据集by变量值在更新数据集中不存在,不产生自动变量_iorc_,但是如果更新数据集by变量值在主数据集中不存在,自动变量_iorc_会返回一个非0值。
Eg:
修改观测值:
Dataa1;
modifya1;
ifx=2theny=200;
Run;
程序解读:
首先编译,创建一个pdv,此时数据集a1处于打开状态,但是由于modify的独特机制,系统并没有另外开辟外存空间,所以整个程序运行过程中,在磁盘设备上看不到数据集a1的临时数据集。
由于modify语句采用动态where语句,而where查询动作是在pdv之前完成,因此当系统读到ifx=2的时候,数据指针在pdv之前就指向该观测值并修改,最后由pdv输出,且输出的方式不是output而是replace方式,除非用户指定output。
系统会默认采用replace方式输出。
当用output的时候,喜欢很可能会陷入死循环。
商业应用:
定期更改客户交易总额
主数据集:
Datamaster_trans;
inputuser_idtrans_amt@@;
cards;
101100010215001032000
;
Run;
交易数据集:
Dataday_trans;
Inputuser_idday_amt@@;
Cards;
10250102601033011080
;
Run;
程序实现:
datamaster_trans;
modifymaster_transday_trans;
byuser_id;
trans_amt=trans_amtday_amt;
if_iorc_=0thenreplace;
elsedo;trans_amt=day_amt;_error_=0;output;end;
run;
程序解读:
第一步:
编译阶段,系统产生两条pdv,一条为master_trans所有,另一条为day_trans所有;
第二步:
Master_trans的数据指针直接指向master_trans的第二条观测,同时day_trans的指针指向day_trans的第一条观测,执行累加语句trans_amt=trans_amtday_amt;执行完后,发现还有day_trans中还有一条观测与master_trans中的第二条观测匹配,于是,day_trans的数据指针指向day_trans的第三条观测,再次执行累加语句,知道day_trans中没有与之匹配的数据,系统会继续执行以下语句,接下来if_iorc_=0thenreplace;被执行,因为该匹配是成功匹配,所以系统返回自动变量_iorc_=0,然后执行replace语句,
重复执行第二步,系统同样以replace方式输出master_trans的第三条观测,
此时master_trans的数据指针指向master_trans末尾,但是day_trans还有最后一条观测没有在master_trans中被发现,于是系统返回一个非零的自动变量_iroc_,此时将执行else后面的语句,最后执行output的输出方式到master_trans的末尾。
当然也可以用sql和merge执行实现:
procsql;
createtabletempas
select
user_id
sum(day_amt)asday_amt
fromday_trans
groupby1;
quit;
procsortdata=master_trans;byuser_id;run;
procsortdata=temp;byuser_id;run;
datamaster_trans;
mergemaster_transtemp;
byuser_id;
iftrans_amteq.thentrans_amt=COALESCE(trans_amt,day_amt);
elsetrans_amt=sum(trans_amt,day_amt);
run;
总结:
modify常用于根据某些需求条件更新特定变量组,或者对主数据集的某些变量做历史累加。
《SAS编程与数据挖掘商业案例》学习笔记之七
(2013-08-0623:
12:
35)
转载▼
标签:
sas
put语句
数据挖掘
数据分析
sas编程
分类:
SAS编程
九:
put语句
可以输出变量信息到指定地点,包括输出到sas系统的日志窗口;
输出到file语句规定的外部文件
输出到sas系统的output窗口
@单尾操作符,多用于input语句中,@@双尾操作符,多用于put语句中。
Dataa;
Inputx$yz@@;
Cards;
A1020b3040c5060
;
Run;
简单方式输出:
Data_null_;
Seta;
Putx$@;
Puty@;
Putz;
Run;
程序读入数据集a的第一条观测值后,执行第一个put语句,输出变量x的值到日志窗口,由于使用固定说明符中的单尾符,故控制指针任然停留在改行,继续执行下一个put语句,输出变量y之后,同理继续输出z,z后面没有指针控制符,故转到下一行。
混合使用五种不同的输出方式:
datamix;
inputx$yzmnpq;
cards;
x102030405060
y708090100110120
;
data_null_;
setmix;
put@2x$@;
puty5-10.2@;
put@15z:
5.3@;
put(mnp)(best10."---"4.2"---"4.2)@;
put@60q=;
run;
商业实战中put主要有两个用途:
输出结果到log窗口,调试程序运行过程中变量产生的中间值;输出结果到外部文件。
libnamech3'f:
\data_model\book_data\chapt3';
odslistingclose;
odsoutputparameterestimates=et;
procregdata=ch3.fitnessoutest=est;
modeloxygen=ageweightruntimerunpulserestpulsemaxpulse;
quit;
odsoutputclose;
odslisting;
filenamefb"f:
\data_model\book_data\chapt3\score";
data_null_;
setet(keep=variableestimate)end=last;
filefbnotitles;
if_n_=1thenput@1"scr=0";
est=abs(estimate);
ifestimate<0thenput@1'-'@;
elseput@1'+'@;
ifvariable='intercept'thenput@5est10.5;
elseput@5'('estbest10.@20'*sum('variable$20.',0))';
iflastthenput@5';';
run;
注:
该程序是商业应用中比较标准的输出多元线性回归分析打分文件的程序;
《SAS编程与数据挖掘商业案例》学习笔记之八
(2013-08-0600:
15:
04)
转载▼
标签:
sas
数据挖掘
file语句
数据分析
sas编程
分类:
SAS编程
十:
file语句
file中的option选项:
Dlm=指定列表输出文件的分隔符,默认是空格
Dropover规定当输出数据行长度超过指定值时,忽略超出部分
Flowover规定当输出数据行长度超过指定值时,超过部分在下一行输出
Dsd规定一个数据项可以包含分隔符,但是要用引号括住默认分隔符是逗号
Encoding=指定输出外部文件所用编码
Filename=定义一个临时变量,用于接收put语句打开的文件名,默认长度为8
Filevar=定义一个临时变量,file语句根据其值变化关闭当前输出文件并在下一次file语句执行时打开新的输出文件,长与input语句连用
Lrecl=输出文件的逻辑记录长度
Mod把输出行输出到文件中已经存在的行的后面
Old替换文件原有的内容
eg:
filenamefile'f:
\data_model\book_data\chapt3\utf.txt';
data_null_;
setsashelp.class;
filefileencoding='utf-8';
putnameweight;
run;
file语句最简单的形式,输出两个变量到新的文件中
eg2:
filenamefiles'f:
\data_model\book_data\chapt3\filename.txt';
dataa;
lengthtemp$50;
filefilesfilename=temp;
put'abc';
fname=temp;
run;
输出两个文件,一个是sas数据集a,一个是文件文件filename.txt
其中数据集a中只有fname一个字段,其值为filename对应的文件名
put语句后面的内容为输出文件的内容,所以数据filename.txt中只有abc,
eg:
datab;
lengthname$200;
inputname;
name='f:
\data_model\book_data\chapt3\'||strip(_infile_)||'.txt';
fileanynamefilevar=name;
date=date();
n=name;
formatdateyymmdd10.;
do;
put'test'@;
put','@;
putdate;
end;
cards;
test_file1
test_file2
test_file3
;
run;
解读:
通过filevar选项的控制同时输出多个外部文件,并把外部文件名输出给sas数据集
蓝色部分为数据集b的内容,黄色部分中put语句后面的为三个文件输出的内容;
cards读入数据后,自动变量_infile_都会自动获取相应的值,第一条记录读取时,test_file1被传送到_infile_变量中,从而filevar变量的值为f:
\data_model\book_data\chapt3\test_file1.txt,然后赋值给n
如果仅仅是读取某一目录下所有外部文件名到另一个文本文件下,只需要如下代码。
data_null_;
doi=1to3;
lengthname$200;
name='f:
\data_model\book_data\chapt3\'||'test_file'||put(i,1.)||'.txt';
fileanynamefilevar=name;
file'f:
\data_model\book_data\chapt3\fname.txt';
putname;
end;
run;
商业实战:
输出定长文本文件
data_null_;
setsashelp.class(keep=namesex)nobs=obsend=last;
date=date();
file"f:
\data_model\book_data\chapt3\test1.txt"dropoverlrecl=32767;
if_n_=1then
do;
put'header'@;
putdate@;formatdateyymmdd10.;
putobsz8.;
end;
do;
putname$1-10@;
putsex$15-16;
;
end;
iflastthendo;
put'end';
end;
run;
集中输出方式:
列方式输出:
在put语句后要紧跟列号,对字符型要加$,如putname$1-8
列表方式输出(自由格式):
只是在put语句后列出变量名,当然字符型要外加$,如putname$age
格式化方式输出:
在put语句后要指明输出格式,输出格式同事指明数据类型和列宽度,最后要加一个句点结尾。
如putname$8.age4.
输出含有逗号不定长文本文件:
libnamechapt3'f:
\data_model\book_data\chapt3';
data_null_;
setchapt3.file_put1;
file"f:
\data_model\book_data\chapt3\test2.txt"dropoverlrecl=32767dsddlm=",";
do;
putfirstname@;
putid@;
putphonenumber;
end;
run;
输出定长且含有逗号的文本文件
data_null_;
setchapt3.file_put2;
file"f:
\data_model\book_data\chapt3\test2.txt"dropoverlrecl=32767;
do;
putfirstname$10.@;
put","@;
putid$3.@;
put","@;
putphonenumber8.;
end;
run;