SAS读取数据的规则是遇到空格时默认该数据读取完毕,除非是指定了数据宽度时,则以宽度值来确定数据;冒号的作用是告诉SAS,如果要读取下一个变量,需要满足下面任一条件:要么遇到空格,要么变量的宽度读完了。
data fh;
input city $18. zone $;
cards;
山东省蓬莱市 0536
山东省威海市乳山市 0532
;
proc print;
run;
data fh;
input city :$18. zone $;
cards;
山东省蓬莱市 0536
山东省威海市乳山市 0532
;
proc print;
run;
使用if_then语句创建新变量
data lx;
input id lx$;
lx1 = lx in ("有效","显效","痊愈");
if lx in ("有效","显效","痊愈") then lx2 = "有效";else lx2 = "无效";
datalines;
1 显效
2 有效
3 无效
4 痊愈
;
proc print;
run;
retain 语句
data a1;
retain a 0; /告诉SAS a 的初始值,以便a = a+1表达式使用/
a = a+1;
input wt ht;
datalines;
60 170
55 166
73 162
;
proc print;
run;
do循环语句
do 变量=初始值 to 最终值 <by 增加量>
SAS语句
end
- do i = 1 to 10;
- do i = 1 to 10 by 2;
data fh;
do count = 1 to 5;
input time;
output;
end;
datalines;
23
29
49
64
87
;
proc print;
run;
SAS中有一个规则:字符串变量的长度是由第一个遇到的值的长度决定的,而且字符变量一旦产生,他的长度就无法改变。
data age;
do id = 1 to 4;
input birth:yymmdd10. death:yymmdd10.;
age = (death - birth)/365;
if age < 60 then age1 = 50;
else if age < 70 then age1 = 60;
else age1 = 70;
format birth death yymmdd10.;
output;
end;
datalines;
1954-12-06 2014-02-03
1938-02-18 2014-01-17
1947-07-10 2014-01-11
1943-08-21 2014-03-03
;
run;
SAS 函数应用技巧
与字符有关的函数
例子:身份证倒数第二位表示性别,奇数为男,偶数为女。
data iden;
input iden:$18.;
if length(iden) = 18 then gen = substrn(iden,17,1);
else gen = substrn(iden,15,1);
if mod(gen,2) = 1 then gender = "男";
else gender = "女";
datalines;
34082319920902371X
360533801215792
360533198208254533
360533851009226
;
proc print;
run;
新版身份证号为18位,老版的则为16位。
这两个函数在查找多个字符的时候有很大差异:对于多个字符的查找,find必须是所有字符都完全匹配才算找到,而findc只要找到字符中的任意一个就算找到。
data book;
input book: & $100.;
sas = find(book,'sas','i');
if sas >0 then class = 'SAS书';
else class = '其他书';
datalines;
Survival Analysis Using SAS
MATLAB 程序设计
SPSS数据分析
SAS应用分析
The Little SAS book
;
proc print;
run;
data computer;
input type$@@;
alpha = anyalpha(type);
digit = anydigit(type);
xh = substrn(type,alpha,digit-alpha);
bh = substrn(type,digit,length(type)-digit+1);
datalines;
TP340 KB320 B3519 C560 H430 LLL
;
proc print;
run;
data lx;
input id lx$;
lx1 = tranwrd(lx,"显效","有效");
lx1 = tranwrd(lx1,"痊愈","有效");
datalines;
1 显效
2 有效
3 无效
4 痊愈
;
proc print;
run;
data computer;
input type$@@;
xh = compress(type,,'d');
bh = compress(type,,'a');
cards;
TP320 KS230 B3214 HJ234 H324
;
proc print;
run;
data code;
input prov$ city$ country$;
code1 = cats(prov,city,country);
code2 = catx("-",prov,city,country);
code3 = prov||city||country; /*常规的连接符*/
cards;
37 05 02
37 02 21
37 06 85
;
proc print;
run;
data cloth;
input pj&:$1000.;
beauty = count(pj,"漂亮");
datalines;
裙子很漂亮,穿起来有仙女的感觉
裙子很喜欢,很漂亮,不知道面料牢固不牢固
裙子很漂亮
裙子很飘逸
面料柔软舒适,很飘逸
很漂亮,超喜欢这颜色
质量一般,没想象中的好
很大方,不足之处是,透气性不是很好
;
proc print;
run;
与时间和日期有关的函数
data date;
input year1$ month1$ day1$ year2$ month2$ day2$;
date1 = mdy(month1,day1,year1);
date2 = mdy(month2,day2,year2);
format date1 date2 yymmdd10.;
ydif = yrdif(date1,date2,"actual");
ddif = datdif(date1,date2,"actual");
datalines;
2013 05 21 2014 03 11
2013 03 10 2014 01 22
2013 06 05 2014 05 06
2013 07 07 2014 04 13
;
proc print;
run;
SAS中有两个函数式专门用于变量类型之间转换的,input函数主要用于把字符型转为数值型,put函数主要用于把数值型转为字符型。
data date;
input year1$ month1$ day1$ year2$ month2$ day2$;
date1 = catx("/",year1,month1,day1);
date2 = catx("/",year2,month2,day2);
d1 = input(date1,yymmdd10.);
d2 = input(date2,yymmdd10.);
format d1 d2 yymmdd8.;
datalines;
2013 05 21 2014 03 11
2013 03 10 2014 01 22
2013 06 05 2014 05 06
2013 07 07 2014 04 13
;
proc print;
run;