2014-09-29 36 views
1

我在数据集调查中有几个变量。我想写一个循环来将每个变量加载到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 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

+0

如果你没有指定一个var语句,proc univariate将运行所有的数值变量。或者对所有数字变量尝试var _numeric_。该数字应该有一个下划线之前和之后,但SO是吃它:( – Reeza 2014-09-30 21:38:33

+0

这种有用的,但不是真的,手动经历这么多的输出将是痛苦的,你到底真的在做什么? – Reeza 2014-09-30 21:41:13

回答

-1

更新的答案。

您可以利用为每个库中的每个SAS数据集(包括工作库)自动创建的VCOLUMN表。此表包含SAS中每个数据集的每个变量的一行。

所以你会做以下。我假设你的survery数据集在工作库中。

因此,代码执行以下操作; 1.在Vcolumn表中查找您的数据集,并只保留变量的名称(即我们需要的)并将其存储到数据集temp中。 2.对于每个变量,通过调用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; 
+0

我运行它,但它不起作用您可以尝试使用其他方法而不是使用Vcolumn吗?因为调查数据只是一个测试数据集,谢谢您! – user3525837 2014-09-30 00:47:33

+0

您也可以在测试数据集上运行它。转到Sashelp目录,然后查看V列表,并检查你的数据集是否出现在表中 – dannmate 2014-09-30 00:53:56

+0

另外,什么是错误信息? – dannmate 2014-09-30 00:54:26

1

这将为所有survay与 “R”(所以R1,R2等)开始运行变量proc univariate。使用var声明的过程通常会接受多个变量。

proc univariate data = survey; 
    var r:; 
run; 

如果您希望为所有数值变量运行与_NUM_取代r:

如果你想循环遍历变量并在每次有几种方法时分别调用一个函数。通常它们涉及宏做循环(必须是宏中的),像这样:

%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 contents(或更好,但proc datasets),该%scan()功能以及分配宏变量的不同方法。网上的sas文档是一个很好的开始。