2012-11-15 14 views
0

Dans ce bloc de code d'étape de données SAS, je définis une table à partir d'une requête SQL appelée TEST_Table. Cette table contient plusieurs colonnes, y compris une plus grande section de colonnes intitulée PREFIX_1 à PREFIX_20. Chaque colonne commence par PREFIX_, puis un nombre croissant de 1 à 20.SAS: définition dynamique d'un nom de variable

Ce que je voudrais faire est itérativement parcourir chaque colonne et analyser la valeur de cette colonne.

Voici un exemple de ce que j'essaie de faire. Comme vous pouvez le voir, je voudrais créer une variable qui augmente à chaque itération, puis j'utilise cette valeur de comptage comme partie du nom de la variable que je vérifie.

data TEST_Data; 
    set TEST_Table; 
    retain changing_number; 

    changing_number=1; 
    do while(changing_number<=20);  
    if PREFIX_changing_number='BAD_IDENTIFIER' then do; 
     PREFIX_changing_number='This is a bad part'; 
    end; 
    end; 

run; 

Quelle serait la meilleure façon de procéder dans SAS? Je sais que je peux le faire en vérifiant simplement chaque valeur individuelle de 1 à 20.

if PREFIX_1 = 'BAD_IDENTIFIER' then do; 
    PREFIX_1 = 'This is a bad part'; 
end; 
if PREFIX_2 = ... 

Mais ce serait vraiment odieux que plus tard, je vais faire la même chose avec un ensemble de plus de 40 colonnes.

Des idées?

SOLUTION

data TEST_Data; 
    set TEST_Table; 

    array SC $ SC1-SC20; 

    do i=1 to dim(SC);  
     if SC{i}='xxx' then do; 
     SC{i}="bad part"; 
     end; 
    end; 
run; 

Nous vous remercions de suggérer des tableaux :)

+1

Vous pouvez supprimer plusieurs parties sans différence. Le {*} n'est pas nécessaire si vous spécifiez explicitement les variables. Le i = 1; ne fait absolument rien. Je recommande fortement d'utiliser dim (SC) plutôt que 20 car cela facilite le maintien de votre code. – Joe

+0

@Joe Ces changements fonctionnent mieux qu'un charme. – Stoating

Répondre

1

Vous devez rechercher un traitement Array SAS. Autrement dit, vous pouvez faire quelque chose comme ceci:

data TEST_Data; 
    set TEST_Table; 
    *retain changing_number; Remove this - even in your code it does nothing useful; 
    array prefixes prefix:; *one of a number of ways to do this; 
    changing_number=1; 
    do while(changing_number<=20);  
    if prefixes[changing_number]='BAD_IDENTIFIER' then do; 
     prefixes[changing_number]='This is a bad part'; 
    end; 
    end; 

run; 

Une boucle légèrement meilleure est:

do changing_number = 1 to dim(prefixes); 
... loop ... 
end; 

Comme c'est en une seule étape, et il est flexible avec le nombre d'éléments du tableau (dim = nombre d'éléments dans le tableau).

Questions connexes