Loops 将每个变量循环到SAS宏中
我在数据集调查中有几个变量。我想写一个循环,将每个变量加载到SAS宏中 代码如下Loops 将每个变量循环到SAS宏中,loops,macros,sas,Loops,Macros,Sas,我在数据集调查中有几个变量。我想写一个循环,将每个变量加载到SAS宏中 代码如下 %let var= r1 r2 r3 ; DATA survey; INPUT id sex $ age inc r1 r2 r3 ; DATALINES; 1 F 35 17 7 2 2 17 M 50 14 5 5 3 33 F 45 6 7 2 7 49 M 24 14 7 5 7 65 F 52 9 4 7 7 81 M 44 11
%let var= r1 r2 r3 ;
DATA survey;
INPUT id sex $ age inc r1 r2 r3 ;
DATALINES;
1 F 35 17 7 2 2
17 M 50 14 5 5 3
33 F 45 6 7 2 7
49 M 24 14 7 5 7
65 F 52 9 4 7 7
81 M 44 11 7 7 7
2 F 34 17 6 5 3
18 M 40 14 7 5 2
34 F 47 6 6 5 6
50 M 35 17 5 7 5
;
%MACRO bvars(input);
proc univariate data = "D:\hsb2" plots;
var &input.;
run;
%MEND bvars;
我只想&var每次只能为一个变量加载到宏bvars中,而不是编写以下内容
%bvars(r1)
%bvars(r2)
%bvars(r3)
.....
当变量数大于100时,这将非常耗时。更新答案
您可以使用为每个库(包括工作库)中的每个SAS数据集自动创建的VCOLUMN表。此表包含SAS中每个数据集的每个变量的一行
因此,您将执行以下操作。我假设您的survery数据集在工作库中
因此,代码执行以下操作:;
1.在Vcolumn表中查找数据集,只保留我们所需的变量名称,并将其存储到数据集temp中。
2.对于每个变量,通过call execute语句运行bvars Marcro
data temp(keep=name);
set Sashelp.Vcolumn;
where libname = 'WORK' and memname = 'SURVEY';
run;
*Call macro using call execute;
data _null_;
set temp;
call execute ("%bvars("||name||");");
run;
这将为survay中所有以r so r1、r2等开头的变量运行proc univariate。。带有var语句的过程通常接受多个变量
proc univariate data = survey;
var r:;
run;
如果希望为所有数值变量运行,请将r:替换为_NUM\u0
如果您想循环遍历变量并每次分别调用函数,有几种方法。通常,它们涉及宏do循环,该循环必须位于宏内部,如下所示:
%macro looper(inData);
/* List all the variable names */
proc contents data = &inData. out = _colNames noprint;
run;
proc sql noprint;
select name
/* Put the variable names in a macro variable list */
into :colNames separated by " "
from _colNames
/* Get only numeric variables */
where type = 1
order by varnum;
quit;
/* Loop through the variable names */
%do i = 1 %to %sysfunc(countw(&colNames.));
%let colName = %scan(&colNAmes., &i.);
%put &colName.;
/* Your macro call or code here */
/* %bvars(&inData., &colName.) */
%end;
%mend looper;
%looper(sashelp.cars);
熟悉宏%do循环、proc内容或更好的proc数据集、%scan函数和分配宏变量的不同方法可能会对您有所帮助。sas在线文档是一个很好的起点。我运行了它,但它不起作用。你能用其他方法代替Vcolumn吗?因为调查数据只是一个测试数据集。谢谢您还可以在测试数据集上运行它。转到Sashelp目录,然后查看Vcolumn表,检查您的数据集是否出现在表中。没有称为SURVEY的数据集。你能为我写完整的代码来了解这一点吗?首先试着从原始代码运行你的数据调查代码。我的代码所做的只是查找您在VCOLUMN表中的问题中所述的名为“survey”的数据集。我不完全确定您的意思。宏通常在运行任何基本SAS代码之前解析为基本SAS代码。如果要将宏解析延迟到数据步骤运行,可以使用call execute,但我不建议使用call execute来调用prov步骤,因为它将在数据步骤内运行,并且可能有意外行为。为完整起见,您希望调用执行“%bvars”| | name | |。如果不指定var语句,proc UNIVARIDATE将对所有数值变量运行。或者尝试对所有数值变量使用var numeric。这个数字前后都应该有下划线,但吃它也是如此:那种有用但实际上也不是,手动处理那么多输出会很痛苦,你到底想要什么?