我有以下数据集
data height;
input name $ var $ value;
datalines;
John test1 175
Peter test1 180
Chris test1 140
John test2 178
Peter test2 182
Chris test2 148
;
run;
我想为每个学生
进行2次测试的平均值值我可以通过以下
创建一个名为mean_v_John的新变量proc sql;
select mean(value) into: mean_v_John
from height
where name = 'John';
quit;
%put &mean_v_John.;
输出:
2216 %put &mean_v_John.;
176.5
问题: 如何使用& mean_v_NAME自动检测学生数量并创建变量?在这个例子中,将有3个变量。
答案 0 :(得分:3)
如果您开始计算每个学生的平均值,您可以使用该表为call symput
routine分配宏变量。像:
data height;
input name $ var $ value;
datalines;
John test1 175
Peter test1 180
Chris test1 140
John test2 178
Peter test2 182
Chris test2 148
;
run;
proc sql noprint;
create table work.mean_height as
select name, mean(value) as mean_height
from work.height
group by name;
data _null_;
set work.mean_height;
call symput("mean_v_"||name,mean_height);
run;
%put John mean: &mean_v_John.;
%put Peter mean: &mean_v_Peter.;
%put Chris mean: &mean_v_Chris.;
答案 1 :(得分:1)
虽然不可能完全按照你想要的那样在SAS中直接执行此操作(在很大程度上因为这不是SAS中惯用的东西),但您可以在一个步骤中做一些相对接近的事情。
如果不使用实际名称,而是使用增量数字,则可以在宏变量伪数组中获得相同的基本结果。请参阅以下内容:
proc sql;
select age, mean(height) into :age1-:age8, :height1-:height8
from sashelp.class
group by age;
quit;
%put _global_;
现在您有两个矢量/数组,一个存储年龄,另一个存储相应的平均高度。你可以用你的名字做同样的事。
宏变量伪数组不是一种语言结构,但它们是那种想要以这种方式使用它们的人所支持的东西;因此,有很多论文在使用各种不同的自定义宏实现(google“SAS Macro Arrays”,然后选择你最喜欢的实现)。