如何在 SAS 中跨多个变量执行相同的数据步骤?

How can I peform same datastep across many variables in SAS?

我的数据看起来像这样,有 500 个变量和一个目标:

var1 var2 var3 var4 ... var500  target

变量的名称不是像上面那样连续的,所以我认为我不能使用像 var1:var500 这样的名称。我想遍历变量来创建图表。有些变量是连续的,有些是名义上的。

for var1 through var500
   if nominal then create graphtypeA var[i] * target
   else if continous then create graphtypeB var[i] * target
end;

我可以轻松创建第二个 table,其中包含要检查的数据类型。数组似乎对执行循环变量的任务很有用。类似于:

data work.mydata;
   set archive.mydata;
   array myarray{501]  myarray1 - myarray501
   do i=1 to 500;
     proc sgpanel;
     panelby myarray[501];
     histogram myarray[i];
   end;     
run;

虽然这不起作用,但它不会检查它是什么类型的变量。如果我们假设我有另一个 sas.dataset 具有 varname 和 vartype(连续的,标称的),我如何循环为给定的 vartype 创建所需的图形?提前致谢。

不幸的是,不可能按照您在此处建议的方式在数据步骤之外使用数组,至少不能以任何非常有效的方式使用。但是,有很多选项可供您使用。一种方法是只调用一次绘图过程并告诉它绘制数据集中的每个数字变量,例如像这样:

proc univariate data = sashelp.class;
    var _NUMERIC_;
    histogram;
run;

如果您要绘制的相同类型的变量在数据集的列顺序中相邻,您可以使用双破折号列表,例如

proc univariate data = sashelp.class;
    var age--weight;
    histogram;
run;

一般来说,您应该设法避免为每个变量分别调用 procs 或 运行 数据步骤 - 只调用一次并一次处理所有内容几乎总是更有效。

基本上,您需要循环一些变量,应用一些逻辑来确定变量类型,然后根据变量类型产生输出。虽然有很多方法可以解决这个问题,但一种解决方案是将您的变量 select 变成一个宏变量,循环遍历这个 "list" (不是正式的数据结构)变量,并使用宏控制逻辑来指定数字和字符变量的不同子例程。

我将使用 sashelp.cars 数据集来说明。在此示例中,变量 origin 是您的 'Target' 变量,变量 Make、Type、Horsepower 和 Cylinders 是数字和字符变量。

* get some data;

data set1 (keep = Make Type Origin Horsepower Cylinders);
 set sashelp.cars;
run;

* create dataset of variable names and types;

proc contents data = set1
out = vars
noprint;
run;

* get variable names and variable types (1=numeric, 2=character)
* into two macro variable "lists" where each entry is seperated
* by a space;

proc sql noprint;
select  name, type
into :varname separated by ' ', :vartype separated by ' '
from vars
where name <> "Make";
quit; 

* put the macro variables to the log to confirm they are what
* you expect

%put &varname;
%put &vartype;

现在,使用宏循环遍历宏变量列表中的值。 countw 函数计算变量的数量,并使用这个数字作为循环迭代器的限制。 scan 函数通过每个变量名称和类型在相应宏变量列表中的相对位置读入。然后对每个变量的类型进行评估,并根据它是字符还是数字生成绘图。在此示例中,为数值变量生成了带有密度图的直方图,为字符变量生成了频率计数条形图。

循环逻辑是通用的,Proc sgpanelProc sgplot可以修改或替换为其他所需的数据步骤处理或程序。

* turn on options that are useful for 
* macro debugging, turn them off 
* when using in production;

options mlogic mprint symbolgen;

%macro plotter;
  %do i = 1 %to %sysfunc(countw(&varname));
        %let nextvar = %scan(&varname, &i, %str( ));
        %let nextvartype = %scan(&vartype, &i, %str( ));

        %if &nextvartype. = 1 %then %do;
          proc sgpanel data=set1 noautolegend;
            title "&nextvar. Distribution";
            panelby Origin;
            histogram &nextvar.;
            density &nextvar.;
            run;    
        %end;

        %if &nextvartype. = 2 %then %do;
          proc sgplot data=set1;
                    title "&nextvar. Count by Origin";
                    vbar &nextvar. /group= origin;
          run;  
        %end;
  %end;
%mend plotter;

*call the macro;
%plotter;