sas-在宏内排名

时间:2014-09-08 02:58:45

标签: sas sas-macro

我正在尝试对列表执行循环以执行多个变量的排名。

然后我用:

进行循环
options mprint;
%macro ranks(listado);
%let count=%sysfunc(countw(&listado));/*counw= count words in a string*/
%do i=1 %to &count;
%put 'count' &count;
    %let vari=%qscan(&listado,&i,%str(,));
    %put 'vari' &vari;

    proc rank data=labo2.J_tabla_modelo groups=10  out=labo2.tmp;
      var &vari.;
      ranks rk_&vari.;
    run;
%end;
%mend;

        %ranks(%str(G_MERGE6_t1_monto6,A_CLI_monto_sucursal_1,A_CLI_monto_sucursal_2,
A_CLI_monto_sucursal_3, A_CLI_monto_sucursal_4,A_M_0705_monto));

我收到以下错误:

ERROR: Number of VAR statement variables was not equal  to the number of RANKS statement variables.

不知道如何解决它。因为如果我运行宏编写的代码。

谢谢!

1 个答案:

答案 0 :(得分:0)

首先,不要这样做宏循环。这很麻烦。生成宏调用列表。

其次,你不是真的想要这样做,在这里。你需要生成的是:

proc rank data=whatever out=whatever;
  var v1 v2 v3 v4;
  ranks r_v1 r_v2 r_v3 r_v4;
run;

你所产生的是一堆不同的PROC RANK,这并不理想。

我是怎么做到的:

data my_vars;
  length vari $32;
  input vari $;
  datalines;
G_MERGE6_t1_monto6
A_CLI_monto_sucursal_1
A_CLI_monto_sucursal_2
A_CLI_monto_sucursal_3
A_CLI_monto_sucursal_4
A_M_0705_monto
;;;;
run;

proc sql;
 select cats('r_',vari) 
   into :ranklist separated by ' '
   from my_vars;
 select vari 
   into :varlist separated by ' '
   from my_vars;
quit;

proc rank data=whatever out=whatever groups=10;
  var &varlist;
  rank &ranklist;
run;

如果您确实需要单独的PROC RANK调用,那么您需要弄清楚如何处理输出,然后采取类似的方法。

(另外,很可能不需要第一个datastep-你可能在某个地方有这些数据,比如在dictionary.columns中)。