Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 将每个变量循环到SAS宏中_Loops_Macros_Sas - Fatal编程技术网

Loops 将每个变量循环到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

我在数据集调查中有几个变量。我想写一个循环,将每个变量加载到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  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。这个数字前后都应该有下划线,但吃它也是如此:那种有用但实际上也不是,手动处理那么多输出会很痛苦,你到底想要什么?