如何将PROC MEANS输出的求和值自动赋值给DATA步的变量
解决方法
有两种常用方式可自动将PROC MEANS计算出的总和赋值到后续DATA步的new_weight变量中,无需手动复制值:
方法一:直接读取总和数据集
利用SET语句在DATA步中一次性读取存储总和的all数据集,将总和变量载入程序数据向量(PDV)后直接使用:
步骤1:优化PROC MEANS(可选但推荐)
添加noprint选项避免日志输出冗余信息,确保all数据集仅保留所需的总和记录:
proc means data=mydata sum noprint; var weight; output out=all sum=overall; run;
步骤2:在目标DATA步中读取总和
data test; /* 仅第一次循环时读取all数据集,获取weight总和 */ if _n_ = 1 then set all(keep=overall); /* 生成自定义首行记录,直接使用读取到的总和 */ if _n_ = 1 then do; YEAR=2015; HOSPITAL="A"; COUNTRY=.; new_weight = overall; /* 赋值总和,注意变量类型需匹配 */ output; end; /* 读取db数据集并输出所有记录 */ set db; output; run;
- 说明:
_n_=1确保仅读取一次all数据集(该数据集仅含一条总和记录),keep=overall仅加载所需的总和变量,避免引入无关变量。 - 注意:若
weight是数值型,new_weight需定义为数值型;若需转为字符串,可使用put函数,例如:new_weight = put(overall, best12.);
方法二:使用宏变量存储总和
将总和存入宏变量,可在多个SAS步骤中重复引用,适合跨步骤使用该值的场景:
步骤1:将总和存入宏变量
用PROC SQL或DATA _NULL_将all数据集中的总和赋值给宏变量:
/* 方式1:PROC SQL */ proc sql noprint; select overall into :total_weight trimmed from all; quit; /* 方式2:DATA步调用CALL SYMPUTX */ data _null_; set all; call symputx('total_weight', overall); run;
步骤2:在目标DATA步中引用宏变量
data test; if _n_ = 1 then do; YEAR=2015; HOSPITAL="A"; COUNTRY=.; new_weight = &total_weight.; /* 直接引用宏变量 */ output; end; set db; output; run;
- 说明:
&total_weight.会被SAS解析为存储的总和值,自动代入到new_weight的赋值语句中。
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

