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;