0

我有以下数据集

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 个变量。

4

2 回答 2

3

如果您从计算每个学生的平均值开始,您可以使用该表将宏变量与call symput常规. 像:

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.;
于 2015-06-12T07:25:27.157 回答
1

虽然不可能完全按照您的意愿在 SAS 中直接执行此操作(很大程度上是因为这在 SAS 中不是惯用的),但您可以一步完成一些相对接近的操作。

如果不使用实际名称,而是使用增量数字,则可以在宏变量伪数组中获得相同的基本结果。请参阅以下内容:

proc sql;
  select age, mean(height) into :age1-:age8, :height1-:height8
  from sashelp.class
  group by age;
quit;

%put _global_;

现在您有两种向量/数组,一种存储年龄,另一种存储相应的平均高度。你可以对你的名字做同样的事情。

宏变量伪数组不是一种语言结构,但是,它们在某种程度上受到想要以这种方式使用它们的人的支持;因此,有很多关于将它们与各种不同的自定义宏实现一起使用的论文(谷歌“SAS Macro Arrays”,然后选择你最喜欢的实现)。

于 2015-06-12T14:50:01.103 回答