="'"&A2&"'"&","
%sysexec md "P:\EC\data_summary&month" & exit;新建文件夹
切断函数:
Round:返回四舍五入后的数值。
Ceil:返回大于等于该值的最小整数。
floor:取小于等于该值的最大整数。
Int:返回整数部分
随机函数:
Ranuni(seed):产生服从均匀分布的随机数
RANNOR(seed) :产生服从正态分布的随机数
a. call symput('group_time',group_time); /申明变量/
b. %let date='16feb2018'd; /申明变量/
c. options validvarname=any;/可以显示中文/
d. proc datasets lib=work kill memtype=data nolist;quit;
/清空work库中的信息/
e. proc options option=encoding;run;/编码,识别中文名/
f. options compress=yes;/压缩数据/
g. %let start=%sysfunc(time());
/运行程序的时间,调用内置函数time(),赋值给start,并将其声明为变量start/
group_time=intnx("week",today(),0); /group_time:取上礼拜天时间/
注意它总是返回一个周期的开始值。INTNX(interval,start-from, increment)
INTNX(interval,from,n) 计算从from开始经过n个interval间隔后的SAS日期。其中interval 可以取'YEAR'、'QTR'、'MONTH'、'WEEK'、'DAY'等。比如,INTNX('MONTH', '16Dec1997'd, 3)结果为1998年3月1日。注意它总是返回一个周期的开始值。date_temp=put(&date,yymmddn8.); /数值格式转换为字符型20180422/
temp=catx('',sort1,sort2);
/*catx:去掉首尾全部空格,并且在字符串之间加上一个指定的字符串*/
compress函数:删除字符串中所有空格var=scan(fname,1,'.');/表示从字串fname中以.为分隔符提取第1个字符串/
(一)字符转换:
1)字符型转换成数值型/日期
Numvar=INPUT(source,informat)
Source为字符,informat为输入格式。
2)数值型转换成字符型/日期
Chavar=PUT(source,format)
Source可以是字符/数值,fromat为输出格式,put返回字符串。
(二)字符型变量的处理
1)提取字符串
substr('string',start,length)
scan('string',i,'char') char是分隔符,默认为空格;i是取第几部分
2)替换字符串
translate('string','to_string',‘from_string’)
upcase()得到字符串大写
low()得到字符串小写
MD5加密
data chk1;
y = put(md5('abc'),binary32.);/二进制/
put y= ;
put z= ;
run;
3)字符串长度
length()从最右边非空格到最左边,包括空格
4)查找字符串的函数
kindex(string1,string2);在string1中搜索string2,返回string2出现的位置;
kindex(string1,string2)>0即可说明string1中含有string2。
find(string,substring<,modifier,startpos>)
返回的是子字符串在字符串中首次出现的位置,<>中表示可以省略,其中startpos表示开始查找的位置
5)删除字符变量中的部分内容
compress('string','char','modifier')
char是要删掉的内容,char默认为空格;modifier若为d,则去除字符串中数字,a则去除字母
6)去除字符型变量中的空格
trim()去除尾部空格,left()将字符串首部空格移到尾部,strip()去除首尾两部的字符
7)合并字符串变量
!! || cat()
(三)数值型变量的处理
round(argumet,<round-off-unit>)按照四舍五入保留到round-off-unit位
ceil,floor分别向上和向下取整数,INT取整数部分。
(四)日期函数
year(date)/month(date)/weekday(date) 一周内的第几天/mdy(month,day,year) SAS日期值
例如date=20120123,存储的是距离1960.1.1的日期值,date_year=int(date/10000),将其当做数据型处理
/***************proc******************/
1、append 过程
proc append base=null data=temp; run;
/将temp数据集的观测添加到null数据集后面/
2、sort 过程
proc sort data=temp nodupkey out=temp1; by x; run;
/temp根据by值进行排序;nodupkey:删除重复by值对应的观测;noduprecs删除重复观测值;by语句可指定多个变量,默认升序排序,可使用descending进行降序排序,注descending在降序变量前/
/***************************************/
/*****************hash对象********************/
data lb.&brand._profile;/hash对象中find方法/
if N=0 then set lap.Counter(keep=Counter_ID Counter_Name Counter_City);
if N=1 then do;
declare hash h(dataset:"lap.Counter");
h.definekey("Counter_ID");/唯一键/
h.definedata("Counter_Name","Counter_City");
h.definedone();
end;
set lb.&brand._profile;
if h.find() ne 0 then do;
Counter_Name="";
Counter_City="";
end;
run;
/通过hash表的find方法,再读入一条观测后,使用find方法将得到与当前观测key值相等的记录;
如果没有找到匹配的记录,则将Counter_Name和Counter_City值定义为空/
/***********将productlist匹进trans表中***********/
data lb.Kiehl_trans;
if 0 then set kie.productlist(keep=product_id new_cat new_product_name);
if n = 1 then do;
declare hash hashLookup(dataset:'kie.productlist');
hashLookup.definekey('product_id');
hashLookup.definedata('new_cat','new_product_name');
hashLookup.definedone();
end;
set lb.Kiehl_trans;
if hashLookup.find() ne 0 then do;
new_cat='';
new_product_name='';
end;
run;
/****************************************************/
/*********计算两时间相差年、季度、月、周、天*******/
data ab;
Format x date9. Y date9.;
X='14feb1991'd;Y='21jan2013'd;
year=Intck('year',x,y);
qtr=Intck('qtr',x,y);
month=Intck('month',x,y);
week=Intck('week',x,y);
day=Intck('day',x,y);
/put year= qtr= month= week= day=;/
run;
/****************************** 转置******************************/
PROC TRANSPOSE DATA=newcatbycnt out=newcatbycnt1(drop=NAME);
BY CustomerID; /列不变/
ID newcat; /newcat变为行/
VAR fag; /fag值/
run;
/**********PROC suveryselect 过程实现各种抽样***********/
其一般形式是:
PROC SURVEYSELECT
data=<源数据集名>
method = <srs l urs l sys >
out=<抽取样本存放的数据集>
n=<抽取数量>(or samprate=抽样比例)
seed =n;
strata <指定分层变量>;
id <指定抽取的样本所保留的源数据集变量>;
run;
说明:method用来指定随机抽样方法的,其中SRS是指不放回简单随机抽样(Simple Random Samping);urs是指放回简单随机抽样(Unrestricted Random Sampling);sys是指系统抽样(Systematic Sampling)。
seed用来指定随机种子数,为非负整数,取0则每次抽取的样本不同,若取大于0的整数,则下次抽样时若输入相同值即可得到相同的样本;
id是指定从源数据集复制到样本数据集的变量,若缺省,则复制所有变量。
例子:
a、简单无重复随机抽样举例:
/按30%的比例从test数据集中抽取样本,并把样本输出到results数据集中/
proc surveyselect data=test1 out=results1 method=srs samprate=0.3;
run;
b、分层等比例随机抽样举例;
proc sort data=test2;
by 分层变量;
run; /先用分层变量对总体样本进行排序/
proc surveyselect data=test2 out=results2 method=srs samprate=0.1;
strata 分层变量;
run; /根据分层变量等比例从总体中抽取样本/
c、分层不等比例抽样举例;
(1)手工设置抽样比例或者抽样数
proc sort data=test3;
by 分层变量;
run; /先用分层变量对总体样本进行排序/
proc surveyselect data=test3 out=results3 method=srs
samprate=(0.1,0.3,0.5,0.2); /根据分层情况设置每一层要抽取的比例/
strata 分层变量;
run; /根据分层变量不等比例从总体中抽取样本/
proc surveyselect data=test3 out=results3 method=srs
n=(30,20,50,40); /根据分层情况设置每一层要抽取的样本数/
strata 分层变量;
run;
(2)根据抽样表进行不等比例抽样
proc sort data=test3;
by 分层变量;
run; /先用分层变量对总体样本进行排序/
proc surveyselect data=test3 out=results3 method=SRS
samprate=samp_table; /通过抽样比例数据集进行抽样,samp_table数据集中要包括分层变量 以及每一分层对应的抽样比例或者数量,如果按比例抽样变量必须用rate来命名抽样比例,如果是按数量抽样必须用nsize来命名抽样数量/
strata 分层变量;
run;