/*创建stuinfo表*/
data stuinfo;
input ID name $ age; /*$默认是8位*/ /*注意数值型缺失值用.表示*/
cards;
1 Tom 2
2 marry 6
3 louis .
4 joy 1
5 bob 1
;
proc print;/*proc print后面如果不指定数据集就是默认当前数据集*/
run;

/*对其中age变量的总和*/
*1)求和语句进行累加---------值得推荐, 我在想 sum+age 和 sum=sum+age等同吗;
data a1;
set stuinfo;
sum+age;
proc print data=a1;run;
*note:sas在读取第一个观测前将求和语句中的累加变量sum的初始值设为0,每次迭代相加的结果保持在sum中,
下一次迭代仍然可以使用。
唯一要注意的是,若某次迭代中变量age为缺失值,求和语句会在当次迭代中将age作为0处理,因而该次迭代与上一次迭代sum数值相同;

*2)retain; /*若age中有缺失值,retain就无法使用,这个要先注意下是否有缺失值*/
data a2;
set stuinfo;
retain sum 0;
sum=sum+age;
proc print data= a2;
run;
*note:与实现1不同的是,这里使用了retain statement以及赋值操作
retain的目的:一是为了保证指定的sum变量不会在data步的每次迭代开始前在PDV中被设置成缺失值,而且保持上一次迭代的数值,以在下次迭代中继续使用(和前面的求和语句的作用相同);
二是给sum赋初始值0;
赋值操作值得注意一下,和上面求和语句不同,若age某次迭代中为缺失值,会导致当次及以后的所有迭代中sum均为缺失值;

*3)proc means-----------------------------值得推荐;
proc means data=stuinfo;
var age;
output out=a3 sum(age)=zonghe; /*可以从a3看age的总和,如下截图*/
run;
/*note:sum函数会将missingvalue 算作0,即为只计算非缺失值参数的和*/

*4)proc sql-----------------------------值得推荐;
proc sql;
create table a4 as
select sum(age) as zonghe from stuinfo;/*as此处即为alias的简写,给变量命名别名*/
quit;

*5)do循环+point,即在do循环中实现整个数据集的遍历以及相应操作 这meiyongguooooooooo;
data a5;
sum=0;
i=1;
do until(i>obs);
set stuinfo nobs=obs point=i;
sum=sum+age;
i=i+1;
output;
end;
stop;
proc print data=a5;
run;
/*note: 通过nobs知道整个数据集的观测数,同时以point指针针对性地读取相应行的数据*/
*6)do循环+end,即在do循环中实现整个数据集的遍历以及相应操作 这meiyongguooooooooo;
data a6;
do until(eof);
set stuinfo end= eof;
sum= sum(sum, age);
put age= sum= eof= ;
output;
end;
proc print data= a6;
run;
*7)do循环+_n_,即在do循环中实现整个数据集的遍历以及相应操作 这meiyongguooooooooo;
data a7;
do _n_= 1 by 1 until(eof);
set stuinfo end= eof;
sum= sum(sum, age);
output;
end;
run;
data a8;
do _n_= 1 to obs;
set stuinfo nobs= obs;
sum= sum(sum, age);
output;
end;
run;
借鉴+练习+学习,若有违权,请联系本人删除,多谢
本文介绍了在 SAS 中对数据集的变量进行累加求和的多种方法,包括数据步的累加语句、使用 RETAIN 保留变量、PROC MEANS 统计过程、PROC SQL 查询以及 DO 循环。每种方法都有其适用场景和注意事项,例如处理缺失值的方式。这些技巧对于 SAS 用户进行数据分析和操作十分实用。
916

被折叠的 条评论
为什么被折叠?



