sas:proc sql select into 有多个输出
Posted
技术标签:
【中文标题】sas:proc sql select into 有多个输出【英文标题】:sas: proc sql select into with more than one output 【发布时间】:2015-06-12 06:22:31 【问题描述】:我有以下数据集
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;
我想为每个学生
制作 mean 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 个变量。
【问题讨论】:
是的。另外,我想将其作为变量以供进一步使用。因为我对 sas 不是很熟悉。请让我高兴以获得更好的解决方案。 这不是真正的 SAS-y;通常你要做的只是创建一个数据集,然后使用该数据集以供将来使用。 宏变量与 R 变量不同 - 它们通常不是您放入数据的对象。SAS 几乎专门将数据集(即 R 数据帧)用于数据。 呼应 Joe,虽然您在技术上可以做到这一点,但我怀疑您进一步尝试对宏变量执行的操作从长远来看是否有用。 【参考方案1】:如果您从计算每个学生的平均值开始,您可以使用该表通过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.;
【讨论】:
【参考方案2】:虽然不可能完全按照您的意愿在 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”,然后选择你最喜欢的实现)。
【讨论】:
以上是关于sas:proc sql select into 有多个输出的主要内容,如果未能解决你的问题,请参考以下文章
SAS Proc SQL INTO - 无法将宏变量写入宏?