thentotal=total*100;
a=flavor<>texture**2;/*在多个一级运算符存在的情况下从右边开始计算*/
b=variety||'.var';
labeltotal="总数";
cards;
navel986
temple777
Valencia899
mandarin578
;
procsortdata=oranges;
bydescendingtotal;按total值降序排列
run;
procprintdata=oranges;
/*var_numeric_;*/
/*var_character_;*/
title'对ORANGES数据集的品尝检验结果';
run;
字符的比较
1、按机器使用的字符排列次序(ASCⅡ或Unicode)从左到右被比较;
2、两个不等长的字符串被比较时,系统在较短的字符串后自动添上空格;
3、在比较符后加冒号,则只比较首字母;
4、如果字符串前面有空格则需要考虑,后面有空格就不需要考虑。
例9operator_char
data;
input(abc)($);输入文本型的变量
ifa>bthenresult1='true';比较a和b,若a>b则result1='true'
elseresult1='false';
result2='Fox'<>'Fox';/*result2变量的长度
由最长的字符串决定*/
result3='Fox'<>'Foxs';
ifa>:
'S'thenresult4="GreatthanS";
cards;
GRAYADAMSG
TOMTOMAT
SamRobeS
saSAgs
{|a
ЩШb
↓↑c
;
run;
procprint;
run;
运算次序:
在括弧里的表达式先计算
第一级:
**(+-)前缀^><<>
第二级:
*/
第三级:
+-
第四级:
||
第五级:
其余比较算符
第六级:
&
第七级:
|
对于相同优先级的算符,左边的运算先做。
但有两个例外:
1.对最高优先级,右边的运算先做
2.当两个比较算符围着一个量时,这个表达式看成是有一个and出现一样被计算。
如:
12<age<20,
等价于:
12<age&age<20
例10ranuni:
生成100个0到1之间的随机数。
data;
fileprint;
don=1to100;
x=ranuni(0);
putx;
end;
run;
procprint;
run;
例11functions
databbb;
inputx1-x5x6$dateyymmdd15.;
/*formatdateyymmdd10.;*/
*formatdateweekdate12.;
x7='o';
x8='Iamastudent';
/*以下是数学函数*/
a1=max(x1,x2);/*最大值*/
a2=sum(x1,x2);/*最小值*/
a3=sign(x3);/*取符号正1负-1*/
a4=sqrt(x5);/*开平方*/
a5=mean(x1,x2);/*取平均值*/
/*以下是截取函数*/
b1=floor(a5);/*向下取整*/
b2=ceil(a5);/*向上取整*/
b3=int(a5);/*去掉小数*/
/*以下是字符函数*/
c1=index(x6,x7);/*取x6中x7的位置*/
c2=substr(x6,3,3);/*x6中从第三位开始截取3位*/
c3=scan(x8,2);/*x8中的第二个字母*/
c4=upcase(x8);/*换成大写*/
c5=compress(x6,x7);/*去除x6中x7位置的字母*/
/*以下是时间函数*/
d1=weekday(date);/*返回星期几*/
d2=year(date);/*返回年份*/
d3=qtr(date);/*返回季度*/
d4=day(date);/*返回日期*/
/*以下是概率函数*/
e1=probnorm(0);/*生成正态分布数*/
e2=n(ofx1-x5);/*非缺失值个数*/
e3=nmiss(ofx1-x5);/*缺失值个数*/
e4=var(x1,x2);/*方差*/
e5=std(x1,x2);/*标准差*/
/*以下是随机数函数*/
f1=ranuni
(1);/*随机生成相关的数*/
cards;
run;
procprint;
run;
(三)DATA步
DATA语句标志了数据步开始,并指定了数据步结束时要生成的数据集名字。
每次读入一行数据,读入后执行数据步中的其它语句,循环数据步读取整个数据。
_N_变量表示DATA步已经执行的次数
_error_变量值为1时表示程序出错
例12flow
dataflow;
/*putx=y=z=_n_;*/
inputxy;
z=x+y;
putx=y=z=;在日志窗口中查找结果。
put_n_=_error_=;
cards;
1020
100200
10002000
;
run;
例13flow1
dataflow1;
putx=y=z=;
setflow;调入已经生成的flow数据集
putx=y=z=;
run;
procprint;
run;
例14flow2
dataflow2;
inputweightwaistjumpssitupspulse;
setflow;
ratio=x/jumps;
dropjumps;在结果中不列出变量jumps
cards;
13345
;
run;
procprint;
run;
例15data
datanew1(drop=z);不列出变量z
setflow;
run;
datanew2(keep=x);保留变量x
setflow;
run;
datanew3(label='thenew3dataset');加标签
setflow;
run;
datanew4(rename=(x=xxy=yy));更改名称
setflow;
run;
procprintdata=new1;
run;
procprintdata=new2;
run;
例16data2
data_data_;
setflow;
run;
data_null_;产生临时数据集,只供put语句等读取结果。
setflow;
u=x+y+z;
putu;
run;
/*data_last_;
setflow;
t=x+y;以最新产生的数据集命名并取代其内容。
run;*/
procprint;
run;
例16input@
data;
inputtype$@;在同一行输入文本
iftype='c'theninputcourse$prof$;
elseiftype='s'theninputname$id3.2;
cards;
cmathzxs
szhao58888
;
procprint;
run;
例17input@@
data;
inputx@@;
cards;
1234
;
run;
procprint;
run;
例18input1
data;
input@1x5.2@6y2.1+2z#2xx;
cards;
12345678912345
234
;
procprint;
run;
例19input2(选学)
datatopics9;
infiledatalinesdsd;
inputspeaker:
$15.title~$40.location&$10.;
datalines;
Whitfield,'LookingatLift',BlueRoom
Puentes,"LifeAftertheRevolution",RedRoom
Townsend,"PeaceinOurTimes",GreenRoom
;
procprint;
run;
例20cards(选学)
data;
inputnumbercitation$50.;
cards4;
1Berry
2LINETAL.,1995;BRADY,1993
3BERG,1990;ROA,1994;WILLIAMS,1992
;;;;
run;
procprint;
run;
例21put
data;在日志窗口中显示1230个“SAS学习”字样。
/*fileprint;*//*changetheoutputwindow*/
put1230*'SAS学习';
run;
procprint;
run;
例22put1
dataput;输出最新的数据行到sas日志窗口
inputxy;
z=x+y;
put_infile_;/*put_all_;*/
put_n_=;
cards;
1020
100200
10002000
;
run;
例23by
databy;
inputstate$city$monthx;
cards;
nca13.02
nca22.1
nca34.03
ncb15.03
ncb26.3
ncb37.3
vac18.1
vac28.2
vac39.3
vad110.8
vad211.1
vad331.2
;
run;
databy1;
setby;调用上述数据集
bystate;按照state分类。
fileprint;
ifx=8.1thenput_all_;
run;
/*databy2;
setby;
bystatecitymonth;
fileprint;
ifx=8.1thenput_all_;
run;
例24output1
datayear81year82year83;
inputyearx1-x2;
ifyear=1981thenoutputyear81;
elseifyear=1982thenoutputyear82;
elseifyear=1983thenoutputyear83;
cards;
198112
198223
198334
;
run;
procprint;
run;
quit;
例25output2
datarepeat;
infilecards;
inputsubject$meal1-meal3;
dropmeal1-meal3;
mea=meal1;output;/*把meal1的值赋给mea*/
mea=meal2;output;
mea=meal3;output;
cards;
a254
b362
;
procprint;
run;
例26output3
datapay;
inputareaamount;
cards;
111100
11125
333160
33380
777142.66
;
procsortdata=pay;
byarea;
datasubtotal;
setpay;
byarea;
iffirst.areathentotal=0;by组的第一个观测
total+amount;
dropamount;
iflast.areathenoutput;by组的最后一个观测
run;
procprint;
run;
例27point
datazxs;创建数据集
don=2tototal;循环
setsasuser.flowpoint=nnobs=total;调用数据
/*if_error_=1thenabort;*/
output;
end;
stop;
run;
PROCPRINTdata=zxs;
RUN;
例28merge
dataperson;
inputname$sex$;
cards;
MARYF
ANNF
TOMM
;
dataplace;
inputname$city$region;
cards;
MARYMIAMI2
ANNTAMPA6
JOSEERIE5
MARYTAMPA7
;
/*procsortdata=person;
byname;
procsortdata=place;
byname;*/
dataresult;
mergepersonplace;并接这两个数据集
*byname;
procprint;
title'DATASETRESULT';
run;
如果去掉byname前的星号,结果如右图所示:
例29update:
用一个升级数据集中的观测来修改一个主数据集。
一定要和by语句一起使用。
dataa;
inputidname$sex$;
cards;
1zxsm
2zjym
3zmf
;
datab;
inputidname$sex$sales;
cards;
1zxsf34
;
datac;
updateab;
byid;
run;
procprint;
run;
1.Delimiter(DLM)选项:
规定一个字符替代空格作为分隔符。
2.Firstobs选项:
不是从文件的第一个记录开始,而是从指定行开始读取记录
3.Obs选项:
规定用户想从输入文件中连续读取的最后一个记录号
例30infile(dlm)
datanew1;
infilecardsdelimiter=',';将,作为分隔符
inputxyz;
cards;
1,2,3
4,5,6
;
datanew2;
infilecardsdlm='ab';ab字母的任何组合均为分隔符。
inputxyz;
cards;
1aa2ab3
4bb5ba6
7a8b9
;
run;
procprintdata=new1;
run;
procprintdata=new2;
run;
DSD选项:
1、使最外层引号括起的内容当成整个字符串输入,并去除最外层引号
2、默认分隔符为逗号
3、两个相邻的分隔符意味着前一个分隔符后的字段为缺失值
例31infile(obs)
dataabc;
infile'e:
\SAS\column.dat'firstobs=2obs=3;
inputa$9.;输出格式为9位数
run;
procprint;
run;
当行末尾数据宽度少于规定宽度时
Flowover:
默认选项,将下一条记录读入
Missover:
将变量置为缺失
Truncover:
将数据直接读入,不管宽度是否少于规定宽度
Stopover:
系统终止数据步执行,报告出错
Lrecl=n选项:
设定源数据文件行的物理长度,缺省为256,最大可设为32767
Pad|Nopad选项:
pad选项指当宽度少于规定宽度时,在后面填充空格至Lrecl=n规定的行长度,缺省为nopad
例32missover
data;
infile'e:
\sas\missover.dat'pad;/*flowovermissovertruncoverstopoverpad*/
inputx5.;
run;
procprint;
run;
例33delete