我正在尝试对列表执行循环以执行多个变量的排名。
然后我用:
进行循环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.
不知道如何解决它。因为如果我运行宏编写的代码。
谢谢!
答案 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中)。