SAS BASE数分--基础常用语句函数以及PROC步骤总结

sas常用語法 | 2019-10-09 18:37:06

一,函数篇

字符型函数:

1,compress函数 消除加保留

语法compress(V1,”AB”, ”I”)I是指删除V1中的AB时不分AB大小写

Compress(V1,” ”)指去掉V1中的缺失值

Compress(V2,”AB”,“K”)K是指保留AB

Eg:可以直接写compress(Z);不写空格代表默认消除空格;

2,substr函数 截取字符串

语法 substr(string,position,length)从第position开始截取截取length位数

EG: y=substr(v1,1,4);假如V1是20170414 那么Y为2017;


3,put函数 数值型变量转化成字符型变量(注意:日期本质是数值型变量SAS默认是1960年1月1日距离指定日期的天数)

语法 Put(V1,format.)

数值型转化为字符型

x=”01 jan 2007”D;

y=put(x,yymmdd10.);z=compress(Y,”-”);

Run;

4,tranward替代

语法:tranward(sours e, target, replacement);在变量V1中,用replacement替代target

EG3:y=tranward(V1,”ab”,”x”);

*tranward与compress在消除方面的不同点为:tranward可以先替代再消除固定AB,compress消除的对象为AB字母。Eg:compress(tranward(v1,”ab”,”x”),””);就只消除AB;Compress(v1,”ab”);就会消除ABA*

数值型函数:

1,input函数把字符型变量转化成数值型或者字符型变量

语法 y=input(sourse,informat)

Eg1:x1=’20071001’; x2=’021001’;

Y1=input(x1,yymmdd10.);Y2=input(x2,yymmdd8.)

Run;

Eg2:字符型转化为字符型

Y=input(“011”,$a.);

($a.是自定义format)

延伸小节

a,字符型转化为日期型的有两种方法

假如是20120606这样的字符型格式,变量名为date,

input语句:y=input(date,yymmdd10.);

mdy语句:y=mdy(substr(date,5,2)*1,substr(date,7,2)*1,substr(date,1,4)*1);

b,日期数值型转化为字符型用put;EG:Y=put(date,$10.);

c,数值型转化为日期型用mdy(取整求余数) EG:如果是20120606这样8位的数值型变量那么要求得本质是数值的日期型变量:y=mdy(mod(int(date/100),100),mod(date,100),int(date/10000));

2,Intck函数 找出间隔月,日,年

语法intck(interval, from,to)

Eg:y=intck(‘qtr’,x1,x2); 注意x1,x2都为日期型函数;返回的是X1日期到X2日期之间季度数。想要返回月份:用y=intck(‘month’,x1,x2); 想要返回天数:用y=intck(‘day,x1,x2);

3,Intnx函数 返回指定时间间隔的日期型

语法intnx(interval,startfrom, increment,<aligment>)

间隔时间年月日,开始日期,间隔步长,日期控制

日期控制的语法:b:返回间隔时常的起始值,m指返回间隔时长的中间值,E指返回间隔时常的末尾值。S:返回间隔步长的同值

Eg:取间隔一年后的同日

Y=intnx(‘year’,x1,1,’sameday’);

取间隔一个月后的末日

Y=intnx(‘month’,x1,1,’E’);

SEL语言函数

1,open函数

语法 open(SAS-set-name); 成功=1,失败=0

2,close函数

语法 close(SAS-SET-NAME);成功=0,失败=1

3,fetchobs函数 获取一条观测值,如果成功=0,失败非0

语法 y=fetchobs(sas-set-id,10);

4,varnum函数 获取某个变量的位置

语法 y=varnum(sas-set-id,name);

5,getvarc函数getvarn函数 返回某一字符型变量的值/数值型变量

语法 y=getvarc(sas-set-id var-num)

待更...------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

二,常用DATA PROC篇

SAS 语句分为DATA 步骤加上PROC步骤。

DATA 步骤是将特定规则的数据放入新建的数据集中,PROC步骤是用于对已有的数据集进行数据分析。

在此总结常用proc步。

1,proc freq 求分类型变量的频数分析

例子:数据集

SAS代码

对train这个数据集里面的gender性别求频数,它会输出


2,proc means 求数值型变量分布分析:统计量均值,中位数,标准差等。

例子,数据集

SAS语句

means 可以对指定变量profit求指定统计量,这里求了均值,分位数,标准差,最大最小可以求出来。还有标准误,方差等都可以求。

var 是统计量的对象,class是分组对象

结果

3,proc summary 求数值型变量分组汇总值

数据集:同上

SAS语句:


结果是将对Product_line产品线这个变量分组后对应的每组最大最小平均以及总和利润输出到新数据集中。


与means 不同,summary 可以输出到数据集,再进行加工,means主要直接产生报表。

4,proc contents 求整个数据集的数据概况,数量,观测,变量类型,长度等

数据集:同上

SAS语句:


结果:


5,proc print 打印出需要的特定规则的过滤后的,求值后的选择性变量的报表。

数据集:同上

SAS 代码:


noobs,不打印1234序列号,sum 加总利润,where筛选,contains 只要Product_group包含‘Kids’这个字符串,注意区分大小写。结果:


6,proc sort 对数据集按照某个字段按照顺序或者降序方式排序。

数据集:

落园 » 七天搞定SAS(一):数据的导入、数据结构

标题有些噱头,不过这里的重点是: speak SAS in 7 days。也就是说,知识是现成的,我这里只是要学会如何讲这门语言,而不是如何边学SAS边学模型。顺便发现我最近喜欢写连载了,自从西藏回来后.....

之所以下定决定学SAS,是因为周围的人都在用SAS。为了和同事的沟通更有效率,还是多学一门语言吧。R再灵活,毕竟还是只有少数人能直接读懂。理论上语言是不应该成为障碍的~就像外语一样,多学一点总是好的,至少出门不发怵是不是?

最后一根稻草则是施老师传给我的一个link:http://blog.softwareadvice.com/articles/bi/3-career-secrets-for-data-scientists-1101712/,据说有数据分析师的职业秘笈...我就忍不住去看了看。其中一句话还是蛮有启发的:

如果有人问你要学什么工具,是SAS,R,EXCEL,SQL,SPSS还是?直接回答:所有。

这个答案一方面霸气,一方面也是,何必被工具束缚呢?

这东西宜突击不宜拖延,所以还是集中搞定吧。七天应该是个不错的时间段。

大致分配如下:
1. 熟悉SAS的数据结构,如基本的向量,数据集,数组;熟悉基本的数据类型,如文本,数字。
2. 熟悉基本的数据输入与输出。
3. 熟悉基本的逻辑语句:循环,判断
4. 熟悉基本的数据操作:筛选行列,筛选或计算变量,合并数据集,计算基本统计量,转置
5. 熟悉基本的文本操作函数
6. 熟悉基本的计量模型函数
7. 熟悉基本的macro编写,局部变量与全局变量

其实这大概也是按照我常用的R里面完成的任务来罗列的。基本计划是完成就可以大致了解SAS的语法了,其他的高级功能现用现学吧。

书籍方面,中文的抢了同事的一本《SAS编程与数据挖掘商业案例》,英文的找了一本「Applied Econometrics Using The SAS System」和「The Little SAS Book」,先这么看着吧。

后知后觉的补充:其实这一系列笔记都是先写再发布的,主要是方便我调整顺序什么的。事实证明绝大多数时间我在看(或者更直接的,抄)「The Little SAS Book」这本书,姚老师的《SAS编程与数据挖掘商业案例》简单看了一晚,作为对于SAS语法的预热。最后那本「Applied Econometrics Using The SAS System」更多是看具体模型的用法了,不是熟悉语法的问题了。例子都是第一本little book上的,很好用。

本系列连载文章:

-------笔记开始-------

SAS的数据类型

首先,sas的编程大概就两块:Data和PROC,这个倒是蛮清晰的划分。然后目前关注data部分。

SAS的数据类型还真的只有两种:数字和文本。那么看来日期就要存成文本型了。变量名称后面加$代表文本型。

SAS的数据读入

手动输入这种就不考虑了,先是怎么从本地文件读入。比如我们有文本文件如下:

R
1
2
3
4
5
6
Lucky2.31.9.3.0
Spot4.62.53.1.5
Tubs7.1..3.8
Hop4.53.21.92.6
Noisy3.81.31.81.5
Winner5.7...

然后SAS里面就可以用

R
1
2
3
4
5
6
7
8
9
10
*CreateaSAS data set named toads;
*Read the data file ToadJump.dat using list input;
DATA toads;
INFILEc:\MyRawData\ToadJump.dat;
INPUT ToadName$Weight Jump1 Jump2 Jump3;
RUN;
*Print the data tomake sure the file was read correctly;
PROC PRINT DATA=toads;
TITLESAS Data Set Toads;
RUN;

这样就建立了一个名为toads的临时数据集,然后读入外部文件ToadJump.dat,然后告诉SAS有四个变量,其中第一个是文本型。这样就OK了。缺失值用一个点.标记。

偶尔数据没那么规范,比如长成:

R
1
2
3
4
5
----+----1----+----2----+----3----+----4
Columbia Peaches356711021
Plains Peanuts2102502
Gilroy Garlics151035121176
Sacramento Tomatoes1248515491

那么就要有点类似正则表达式的感觉,告诉SAS更多的参数:

R
1
2
3
4
5
6
7
8
9
10
11
*CreateaSAS data set named sales;
*Read the data file OnionRing.dat using column input;
DATA sales;
INFILEc:\MyRawData\OnionRing.dat;
INPUT VisitingTeam$1-20ConcessionSales21-24BleacherSales25-28
OurHits29-31TheirHits32-34OurRuns35-37TheirRuns38-40;
RUN;
*Print the data tomake sure the file was read correctly;
PROC PRINT DATA=sales;
TITLESAS Data Set Sales;
RUN;

这样SAS就可以正确的读数据了—类似于excel的导入文本-固定宽度分隔。

再不规则的话,比如有日期型的:

R
1
2
3
4
5
6
Alicia Grossman13c10-28-20087.86.57.28.07.9
Matthew Lee9D10-30-20086.55.96.86.08.1
Elizabeth Garcia10C10-29-20088.97.98.59.08.8
Lori Newcombe6D10-30-20086.75.64.95.26.1
Jose Martinez7d10-31-20088.99.510.09.79.0
Brian Williams11C10-29-20087.88.48.57.98.0

那么接下来就是:

R
1
2
3
4
5
6
7
8
9
10
11
*CreateaSAS data set named contest;
*Read the file Pumpkin.dat using formatted input;
DATA contest;
INFILEc:\MyRawData\Pumpkin.dat;
INPUT Name$16.Age3.+1Type$1.+1Date MMDDYY10.
(Score1 Score2 Score3 Score4 Score5)(4.1);
RUN;
*Print the data set tomake sure the file was read correctly;
PROC PRINT DATA=contest;
TITLEPumpkin Carving Contest;
RUN;

就是说,name是一个长度为16的字符;age是长度为3、无小数点的数字;+1跳过空列;type是长度为1的文本;date是MMDDYY长度为10的日期;score1-5是长度为4,小数部分为1位的数字。

还有若干更复杂的,可以遇到时侯回来查手册。此外还有@可用来直接指定开始读的列。鉴于我接触的数据一般比较规范,这些就不细看了。

此外SAS可以指定开始读的行数,读取的行数等。

R
1
2
3
4
DATA icecream;
INFILEc:\MyRawData\IceCreamSales.datFIRSTOBS=3;
INPUT Flavor$1-9Location BoxesSold;
RUN;

SAS读取CSV数据

以我最关心的CSV文件为例,如下数据:

R
1
2
3
4
5
Lupine Lights,12/3/2007,45,63,70,
Awesome Octaves,12/15/2007,17,28,44,12
"Stop, Drop, and Rock-N-Roll",1/5/2008,34,62,77,91
The Silveyville Jazz Quartet,1/18/2008,38,30,42,43
Catalina Converts,1/31/2008,56,,65,34

只需要:

R
1
2
3
4
5
6
7
DATA music;
INFILEc:\MyRawData\Bands.csvDLM=,DSD MISSOVER;
INPUT BandName:$30.GigDate:MMDDYY10.EightPM NinePM TenPM ElevenPM;
RUN;
PROC PRINT DATA=music;
TITLECustomers at EachGig;
RUN;

其实,貌似更简单的办法是:

R
1
2
3
4
5
6
7
DATA music;
INFILEc:\MyRawData\Bands.csvDLM=,DSD MISSOVER;
INPUT BandName:$30.GigDate:MMDDYY10.EightPM NinePM TenPM ElevenPM;
RUN;
PROC PRINT DATA=music;
TITLECustomers at EachGig;
RUN;

好吧,import果然更直接一点...excel文件也可以如法炮制。

SAS读取excel数据

R
1
2
3
4
5
6
*Read an Excel spreadsheet using PROC IMPORT;
PROC IMPORT DATAFILE='c:\MyExcelFiles\OnionRing.xls'DBMS=XLS OUT=sales;
RUN;
PROC PRINT DATA=sales;
TITLE'SAS Data Set Read From Excel File';
RUN;

如果需要SAS永久存着这些数据,则需要先指定libname:

R
1
2
3
4
5
6
LIBNAME plantsc:\MySASLib;
DATA plants.magnolia;
INFILEc:\MyRawData\Mag.dat;
INPUT ScientificName$1-14CommonName$16-32MaximumHeight
AgeBloom Type$Color$;
RUN;

后期就可以直接调用啦:

R
1
2
3
4
LIBNAME examplec:\MySASLib;
PROC PRINT DATA=example.magnolia;
TITLEMagnolias;
RUN;

SAS 读取Teradata数据

最后就是从teradata里面读数据,可以利用teradata fastexport特性:

R
1
2
3
4
libname tra Teradata user=terauser pw=XXXXXX server=boom;
proc freq data=tra.big(dbsliceparm=all);
table x1-x3;
run;

等价于:

R
1
2
3
4
5
proc sql;
connect toteradata(user=terauser password=XXXXXX server=boom dbsliceparm=all);
select*from connection toteradata
(select*from big);
quit;

暂时没有fastload的需求,就先这样吧。可以参见SAS的TD手册:http://support.sas.com/resources/papers/teradata.pdf

本系列连载文章:

SAS过程步及常用语句

VIP专享文档是百度文库认证用户/机构上传的专业性文档,文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP专享文档”标识的文档便是该类文档。 了解文档类型

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取,非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档。 了解文档类型

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取,非会员用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档。 了解文档类型

付费文档是百度文库认证用户/机构上传的专业性文档,需要文库用户支付人民币获取,具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档。 了解文档类型

共享文档是百度文库用户免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定。只要带有以下“共享文档”标识的文档便是该类文档。 了解文档类型