sas-宏中的秩

sas-宏中的秩,sas,sas-macro,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(,)

我试图在列表上做一个循环,对几个变量进行排序

然后我用以下方法进行循环:

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));
我得到以下错误:

我不知道怎么解决它。因为如果我运行宏编写的代码,它就会工作


谢谢

首先,不要以这种方式执行宏循环。很乱。生成宏调用的列表

第二,在这里,你也不是真的想这么做。您需要生成以下内容:

proc rank data=whatever out=whatever;
  var v1 v2 v3 v4;
  ranks r_v1 r_v2 r_v3 r_v4;
run;
您生成的是一组不同的进程等级,这并不理想

我会怎么做:

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
调用,那么您需要找出如何处理输出,然后执行类似的方法


(而且,第一个数据步骤可能不需要——您可能在某个地方有这些数据,比如在dictionary.columns中)。

好的,您是对的。但是因为我已经有了列名,所以我尝试了以下方法:procsql;从dictionary.columns中选择cats('r_',name)进入:lista_rank,由“”分隔,其中libname='LABO2'和MEMNAME='J_TABLA_MODELO',名称如'%monto%';退出但我得到:明显的符号引用列表未解析。听起来您的过程SQL没有正确工作。例如,Name可能是大写的,但我认为LIKE不应该关心它;将名称选择到:lista_monto,由dictionary.columns中的“”分隔,其中libname='LABO2'和MEMNAME='J_TABLA_MODELO',名称类似于“%monto%”;退出他正在工作。也许是和猫有关的事???不知道。不,猫没问题。它是否会在输出窗口中列出r_变量?
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;