2014-09-08 4 views
1

J'essaye de faire une boucle sur une liste pour effectuer des rangs pour plusieurs variables.sas- classer dans une macro

Et puis je fais la boucle avec:

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)); 

Je reçois l'erreur suivante:

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

Je ne sais pas comment le résoudre. Parce que si je cours le code écrit par la macro fonctionne.

Merci!

Répondre

0

Tout d'abord, ne faites pas la boucle de macro de cette façon. C'est désordonné. Générer une liste d'appels de macro. Deuxièmement, vous ne voulez pas vraiment faire ça non plus, ici. Ce que vous devez générer est la suivante:

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

Ce que vous générez est un tas de différentes RANGS PROC, ce qui est pas idéal.

Comment je le ferais:

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; 

Si vous avez réellement besoin des PROC RANK individuels appels, alors vous devez savoir comment faire face à la sortie, puis faire une approche similaire.

(De plus, il est probable que le premier datastep n'est pas nécessaire - vous avez probablement ces données quelque part, comme dans dictionary.columns).

+0

ok vous avez raison. Mais puisque j'ai déjà les noms des colonnes, j'ai essayé ceci: ** proc sql; sélectionnez cats ('r_', name) dans: lista_rank séparés par '' de dictionary.columns où libname = 'LABO2' AND MEMNAME = 'J_TABLA_MODELO' et nom comme '% monto%'; quit; ** mais j'obtiens: ** La référence symbolique apparente LISTA_RANK n'est pas résolue. ** – GabyLP

+0

sonne comme si votre SQL PROC ne fonctionnait pas correctement. Le nom est probablement en majuscule, pour un, mais je pense que LIKE ne devrait pas s'en préoccuper. – Joe

+0

Ce n'est pas parce que celui-ci: ** proc sql; sélectionnez le nom dans: lista_monto séparé par '' de dictionary.columns où libname = 'LABO2' AND MEMNAME = 'J_TABLA_MODELO' et nom comme '% monto%'; quitter; ** fonctionne. ** Peut-être quelque chose en rapport avec les chats ??? ne sait pas. ** – GabyLP