SAS函数是一个子程序,对自变量返回一个结果值。
SAS函数的基本形式:
y=函数名(X1,X2,…),其中X1,X2…为参数值
字符—character:一个一个地字符,如’a’,‘a’‘b’(‘ab’);
字符串—string:一个或多个字符组成的串,如’a’,‘ab’;
词—word:由分隔符(delimeter)隔开的字符串,如’I love programming’‘I@love@programming’;
mod(x,y):返回x除以y的余数;
int(x):返回x的整数部分;
ceil(x):返回≥x的最小整数;
floor(x):返回≤x的最大整数;
round(x,舍入值):根据舍入值对x进行舍入,即将x舍入到最接近能被舍入值整除的数值;
abs(x):返回x的绝对值;
log(x):返回x的自然对数值;
sqrt(x):返回x的平方根;
exp(x):返回x的指数值;
data a;
num1=round(8.6,0.1);
num2=round(8.6,1);
num3=round(8.6,2);
a=mod(10,3);
b=int(8.6);
c=ceil(8.6);
d=floor(8.6);
e=abs(-8.6);
f=sqrt(4);
g=log(4);
h=exp(4);
run;
proc print;
run;
运行结果:
date()、today():返回当天的日期;
year()、month()、day()和qtr():分别提取一个日期中的年、月、日、季度;
mdy(month,day,year):将月、日、年组合成完整日期;
intck(‘’custom-inteval‘’,start-date,end-date):返回在一个给定的时间跨度内发生的时间间隔的数量,可以用来计算天day、周week、月month、年year、季度qtr等;
yrdif(开始日期,结束日期,“计算依据”):当计算依据为actual时,计算两个日期之间以年为单位的差值;当计算依据为age时,计算两个日期之间的年龄差值;
datdif(开始日期,结束日期,“计算依据”):当计算依据为actual时,计算两个日期之间以天为单位的差值;
data datetime;
format td date yymmdd10.;
da=date();
td=today();
year=year(td);
month=month(td);
day=day(td);
q=qtr(td);
date=mdy(8,02,2018);
yd=yrdif(date,td,'actul');
age=yrdif(date,td,'age');
dd=datdif(date,td,'actul');
days=intck('day',date,td);
run;
运行结果:
字母大小写转换
upcase(‘’):转换为大写;
lowcase(‘’):转换为小写;
propcase(‘argument’<,‘delimiters’>):各单词首字母大写,其余小写,默认的分隔符delimiters是空白,正斜杠,连字符、开括号、句号和制表符;
data change_case;
a=upcase('abc');
b=lowcase('Abc');
c=propcase('ab cD');
run;
空格处理
trim(‘’):移除尾部空格;
left(‘’):移除首部空格;
strip(‘’):移除首尾空格;
compress(‘’):移除所有空格(或指定字符)
compress(source<,character><,modifier(s)>)
compbl(‘’):将多个连续空格,压缩为1个;
data space;
a=trim(' abcd ');
b=left(' abcd ');
c=strip('abcd ');
d=compress(' abcd mn');
e=compbl(' abcd mn');
run;
运行结果:
去除变量的字符
compress(变量<,要去除的字符><,修饰符>)
修饰符常用:
修饰符 | 含义 |
---|---|
a | 去除掉变量中的所有字母 |
d | 去除掉变量中的所有数字 |
s | 去除掉变量中的所有空格 |
i | 忽略大小写 |
k | 保留“要去除的字符”,去除掉其它字符 |
data compress; /*移除所有空格或特殊字符*/
input p& $ 1-20;
q1=compress(p);
q2=compress(p,'(-)');
q3=compress(p,'(-)','d');
q4=compress(p,,'d');
q5=compress(p,'(-)','s');
q6=compress(p,'(-)','k');
datalines;
(123)456-7890
(123)456-78 90
;
run;
proc print;
run;
结果如下:
长度
length(变量):返回变量值长度,尾部空格不计数,空字符串与连续空格视为1个字符串;
lengthn(变量):返回变量长度,尾部空格不计数,空字符串与连续空格视为0个字符串;
lengthc(变量):返回变量值长度,对首尾空格及连续空格计数,空字符串记为1个字符;
data length;
a=''; /*没有空格*/
b=' '; /*有一个空格*/
c=' '; /*有三个空格*/
d=' ABC DEF '; /*首尾及中间各有一个空格*/
e=' ABC DEF'; /*首部及中间各有一个空格*/
/* 返回变量值长度,尾部空格不计数,空字符串与连续空格视为1个字符串*/
length_a=length(a);
length_b=length(b);
length_c=length(c);
length_d=length(d);
length_e=length(e);
run;
proc print;
run;
结果如下:
data lengthn;
set length(keep=a b c d e);
/* 返回变量值长度,尾部空格不计数,空字符串与连续空格视为0*/
lengthn_a=lengthn(a);
lengthn_b=lengthn(b);
lengthn_c=lengthn(c);
lengthn_d=lengthn(d);
lengthn_e=lengthn(e);
run;
proc print;
run;
结果如下:
data lengthc;
set length(keep=a b c d e);
/* 返回变量值长度,对首尾空格及连续空格计数,空字符串为1*/
lengthc_a=lengthc(a);
lengthc_b=lengthc(b);
lengthc_c=lengthc(c);
lengthc_d=lengthc(d);
lengthc_e=lengthc(e);
run;
proc print;
run;
结果如下:
字符串连接
||:连字符;
cat(x,y):直接连接;
catt(x,y):去尾部空格再连接;
cats(x,y):去首尾空格再连接;
catx(‘’,x,y):去首尾空格,用分隔符连接;
data link;
x=' 性别 ';
y=' 女 ';
a=x||y; /*连字符,直接连接*/
b=cat(x,y); /*直接连接*/
c=catt(x,y); /*去尾部空格,再连接*/
d=cats(x,y); /*去首尾空格,再连接*/
e=catx(':',x,y); /*去首尾空格,用分隔符连接*/
run;
结果如下:
截取
substr(变量,起始位置<,提取长度>):提取字符串;如果字符串是汉字,用ksubstr()来提取;
substrn(变量,起始位置<,提取长度>):提取字符串;允许长度为0或超出;
scan(string,n<,delimiters>):返回第n个word,分隔符delimiters若没有指定,默认的有blank . < ( + | & ! $ * ) ; ^ - / , %;
data substr_scan;
a1=substr('ABCDEF',3);
b1=substrn('ABCDEF',3,2);
a2=substr('ABCDEF',5,3);
b2=substrn('ABCDEF',5,3);
a3=scan('AB CDEF',1);
b3=scan('AB@CDEF',-1,'@');
id='D12';
city='一线城市';
c=substr(id,2,1);
c1=substr(id,2);
d=substr(city,3,2);
d1=substr(city,2);
e=ksubstr(city,3,2);
e1=ksubstr(city,2);
run;
proc print;
run;
运行结果:
查看Log会发现a2报错了,因为截取的长度超出了字符串的实际长度,所以在使用时应当留心或者采用substrn()函数来截取,错误提提示:
查找
index(‘x’,‘y’):在x中查找字符串y,返回第一次出现的位置,找不到返回0,如果字符串是汉字使用kindex()函数查找字符串;
indexw(‘x’,‘y’):在x中查找word y,返回第一次出现的位置,找不到返回0;
indexc(‘x’,‘y’):在x中查找字符y,返回第一次出现的位置,找不到返回0;
/***********查找函数 index kindex indexw indexc***********/
data index;
a1=index('abcd cd', 'cd');
b1=index('abcd cd', 'dc');
a2=indexw('abcd cd', 'cd');
b2=indexw('abcd cd', 'dc');
a3=indexc('abcd cd', 'cd');
b3=indexc('abcd cd', 'dc'); /*将'dc'拆分为两个字符,哪个字符先出现,就返回哪个字符的位置*/
run;
proc print;
run;
运行结果:
data index1; /*注意空格,定义长度后,变量不满的部分会用空格填充*/
length a b $14; /*$14. 同样*/
a='ABC.DEF (X=Y)';
b='X=Y';
q=index(a,b);
w=index(a,trim(b));
put q= w=;
run;
proc print;
run;
运行结果
data kindex;
text1='汉字汉字汉字';
a=kindex(text1,'字汉');
a1=index(text1,'字汉');
text2='汉字';
b=kindex(text1,text2);
b1=index(text1,text2);
run;
proc print;
run;
运行结果
data indexc;
a='ABC.DEP (X2=Y1)';
x=indexc(a, '0123', ';()=.');
put x;
b='have a good day';
y=indexc(b, 'pleasant', 'very');
put y;
run;
proc print;
run;
运行结果:
替换
translate(字符串,替换后的字符,需要替换的字符):替换字符函数;
tranwrd(字符串,需要替换的字符串,替换后的字符串):替换字符串函数,子字符串中含有尾部空格时,要用trim()删除,替换后的字符串长度为0时,替换为1个空格,替换后的字符串为多个空格时,替换为相应数目的空格;
/***********替换函数 translate tranwrd***********/
data translate;
a1=translate('XYZW','A''B','V''W');
b1=translate('XYZW','AB','VW');
string1='AABBAABABB';
c1=translate(string1,'12','AB');
a2=tranwrd('XYZW','VW','AB');
string1='AABBAABABB';
c2=tranwrd(string1,'AB','12');
run;
proc print;
run;
运行结果
变量类型转换
input(source,informat)函数:把字符串转换为数值函数或其他类型的字符型函数;
put(source,format)函数:把数值型转换为字符型函数或其他类型的字符型函数
data input; /*将字符型转换成数值型*/
a=input('123.5',best.);
input sale $9.;
fmtsale=input(sale, comma9.);
datalines;
2,115,353
;
run;
proc print;
run;
运行结果
proc format;
value $ sex 'F'='Female'
'M'='Male';
run;
data put; /*将数值型转换成字符型*/
format b $sex.;
a=put(123,8.2);
b=put('F',$sex.);
numdate=122591;
chardate=put(numdate, z6.);
sasdate=input(chardate, mmddyy6.);
run;
proc print;
run;
运行结果
n(变量1,变量2,…):返回非缺失值的个数(针对数值型变量或常量),即统计数值型变量非空个数;(多个变量时,不是同时满足缺失,而是一个记一个数,下同)
nmiss:返回缺失值的个数(针对数值型变量或常量,将字符型变量的所有值都当作缺失值);
cmiss:返回缺失值的个数(数值型、字符型均可);
not missing:如果是缺失的,则返回0;反之,则返回1;
missing:如果是缺失的,则返回1;反之,则返回0;
call missing:对参数进行操作,置空;
/***********缺失值函数 n,nmiss,cmiss,not missing,missing,call missing************/
data class;
set sashelp.class;
if age=13 then call missing(weight,sex);
a=n(age,weight);
b=nmiss(age,weight);
c=cmiss(sex,weight);
d=not missing(sex);
e=missing(sex);
drop name height;
run;
proc print;
run;
运行结果:
ifc(条件,执行语句1,执行语句2):返回字符型变量或常量,如果满足条件则执行执行语句1,反之,执行执行语句2;
ifn(条件,执行语句1,执行语句2):返回值数值型变量,如果满足条件则执行执行语句1,反之,执行执行语句2;
/************条件判断函数 ifc ifn***********/
data if;
score1=85;
a1=ifc(score1>95,"Great","Not Great");
a2=ifc(score1>60,"Great","Not Great");
score2=60;
b=ifn(score2>90,5,6);
score3=.;
c1=ifn(score3<90,2,3);
c2=ifn(score3=.,.,ifn(score3<90,2,3));
if score3=. then c3=.;
else if score3<90 then c3=2;
else c3=3;
if not missing(score3) then
d=ifn(score3<90,2,3);
run;
proc print;
run;
运行结果