2014-09-08 3 views
1

Я пытаюсь сделать цикл над списком, чтобы выполнить ранги для нескольких переменных.sas- rank внутри макроса

И тогда я делаю петлю:

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

Прежде всего, не делайте цикл макросов таким образом. Это грязно. Создайте список вызовов макросов.

Во-вторых, вы тоже не хотите этого делать. Что вам нужно создать это:

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

Что вы создаете это куча различных PROC рангов, который не является идеальным.

Как бы это сделать:

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 не понадобится - у вас, вероятно, есть данные где-то, как в словарях.).

+0

ОК, вы правы. Но поскольку у меня уже есть имена столбцов, я пробовал это: ** proc sql; выберите cats ('r_', name) в: lista_rank, разделенные символом '' from dictionary.columns, где libname = 'LABO2' AND MEMNAME = 'J_TABLA_MODELO' и имя, как '% monto%'; quit; ** но я получаю: ** Явная символическая ссылка LISTA_RANK не разрешена. ** – GabyLP

+0

звучит так, как будто ваш PROC SQL работал неправильно. Имя, вероятно, является верхним регистром, для одного, хотя я думаю, что LIKE не должен заботиться об этом. – Joe

+0

Это не значит, потому что этот: ** proc sql; выберите имя в: lista_monto, разделенное символом '' from dictionary.columns, где libname = 'LABO2' AND MEMNAME = 'J_TABLA_MODELO' и имя типа '% monto%'; quit; ** работает. ** Может быть, что-то связанное с кошками ??? не знаю. ** – GabyLP

Смежные вопросы