TIPS:
1:当output没有规定数据集名字时,把当前观测《也就是一行数据》输出到data步后面的所有数据集的末尾<注意是所有数据集>意味着纵向合并,当规定数据集名字时,把pdv当前观测输出到output规定的数据集末尾。
2:在有output语句和run语句同时存在的data步里面,pdv只会执行output的结果到正在被创建的数据集,而执行run语句的结果是pdv会清空所有的变量为缺失。
3:如果一个output语句出现在程序语句中间,无论有没有被执行,后面的语句都将继续被执行,但是不会输出结果到正在被创建的输出数据集,而是会持续清空pdv中所有变量值(使用retain性质的语句除外).
4:sas中有implicit output和explicit output,在每一轮data循环后,sas会默认的将pdv中的数据写入数据集,这就是implicit output,还有一类是用户明确写的output语句,也就是explicit output,当明确规定后,隐式的output就不会再执行了。
5:output是将数据输入数据集,put是将数据输入文件或日志
*需求:输出by组的最后一行观测值并将上一行的y值输出;data a;
input x y@@;
cards;
1 10 1 20 1 200 2 30 2 40
3 50 3 60 4 70 3 80 4 400
;
run;
proc sort data=a;by x;run;
data res;
set a;
by x;
retain rt; *如不用retain,下面的put能输出正确的值,但是运行到run后会自动清空,这样output的结果集中rt都会为缺失值;
if first.x then rt=0;
if last.x then output;
rt = y;
put rt=;
run;
proc print data=res noobs;
结果
xyrt
120020
24030
38060
440070----------------------------------------------------------------------------------------------------------
*由一个输入数据行输出多条观测;
data a;
input id x1-x3;
cards;
101 10 20 30
102 40 50 60
;
run;
proc print;run;
Obsidx1x2x3
1101102030
2102405060
data b;
set a;
x = x1; output;
x = x2; output;
x = x3; output;
output;
run;
proc print;run;
Obsidx1x2x3x
110110203010
210110203020
310110203030
410110203030
510240506040
610240506050
710240506060
810240506060
data c1 c2;*根据条件选择输出;
set sashelp.class;
if _n_ le 7 then output c1;
else output c2;
run;
proc print data=c1;run;
ObsNameSexAgeHeightWeight
1阿尔弗雷德男1469.0112.5
2爱丽丝女1356.584.0
3芭芭拉女1365.398.0
4凯露女1462.8102.5
5亨利男1463.5102.5
6詹姆斯男1257.383.0
7简女1259.884.5
proc print data=c2;run;
ObsNameSexAgeHeightWeight
1雅妮特女1562.5112.5
2杰弗瑞男1362.584.0
3约翰男1259.099.5
4乔伊斯女1151.350.5
5茱迪女1464.390.0
6罗伊斯女1256.377.0
7玛丽女1566.5112.0
8菲利普男1672.0150.0
9罗伯特男1264.8128.0
10罗纳德男1567.0133.0
11托马斯男1157.585.0
12威廉男1566.5112.0