Après avoir présenté les deux alternatives sous SAS dans un data step pour définir des conditions (La base du IF et SELECT), partons voir la syntaxe de PROC SQL pour définir une nouvelle variable.
1. Différences et ressemblances avec les IF et SELECT
Différences : A la différence des deux syntaxes du data step,…
- … une seule action est possible pour une condition donnée : à savoir définir une et une seule nouvelle variable ou macro variable. Les conditions ne peuvent dont pas servir pour créer de nouveaux data sets ou imbriquer des conditions dans d’autres conditions.
- … le nom de la nouvelle variable n’est donné qu’une seule fois.
Ressemblances :
- Comme dans SELECT WHEN et ELSE IF, seuls les records non déjà valides pour les cas listés précédemment sont relus.
- Comme IF THEN, une dernière condition ELSE liste tous les cas non sélectionnés auparavant.
Un des avantages de la procédure SQL est de pouvoir définir une nouvelle variable à partir d’une ancienne variable portant le même nom. Alors que dans un data step, cela se passe en plusieurs étapes :
- Tout d’abord, la variable est renommée pour pouvoir se servir de son nom d’origine pour la nouvelle variable.
- Ensuite la variable d’origine portant le nom créé uniquement pour l’occasion est supprimée.
Un autre avantage est l’usage des fonctions et du mot-clé DISTINCT.
2. La syntaxe CASE WHEN en exemple
2.1 Définir une variable à partir de plusieurs variables
Dans cet exemple, la variable POP prend au maximum 4 valeurs :
- 1 si la variable AGE est supérieure à 13 et la variable SEX est égale à F ;
- 2 si l’AGE est entre 0 et 13 et qu’il s’agit d’une femme ;
- 3 si il s’agit d’un homme et que l’âge est une valeur positive ;
- valeur manquante enfin pour les autres cas.
proc sql;
/*create table class as*/
select *, case
when age > 13 and sex=‘F’ then 1
when age >= 0 and sex=‘F’ then 2
when age < 0 or sex not in (‘F’,‘M’) then .
else 3
end as pop
from sashelp.class;
quit;
2.2 Utiliser les fonctions
Dans l’exemple ci-dessous, le critère est appliqué par groupe de valeurs définies dans la variable SEX. En regardant les données, deux groupes de valeurs apparaissent : ‘F’ pour les femmes et ‘M’ pour les hommes. La variable MAX_AGE1 est égale à ’13’ si, pour un groupe donné, la valeur maximale observée parmi les valeurs non manquantes de la variable AGE est 13. Sinon, MAX_AGE1 prend la valeur ‘N/A’.
proc sql;
select sex, case
when max(age) = 13 then ’13’
else ‘N/A’
end as max_age1
from sashelp.class
group by sex;
quit;
A présent, vu qu’il n’y a qu’un critère définissant la condition et qu’une seule valeur n’est attendue, ce critère peut être donné en début.
proc sql;
select sex, case max(age)
when (13) then ’13’
else ‘N/A’
end as max_age2
from sashelp.class
group by sex;
quit;
Mais, il est bon de se demander si un format ne serait pas plus adapté dans ce cas.
proc format;
value max_age
13 = ’13’
other = ‘N/A’;
run;
proc sql;
select sex, put(max(age),max_age.) as max_age2
from sashelp.class
group by sex;
quit;
2.3 Créer une macro variable
Voici pour terminer un petit exemple où une macro variable POP est crée. Sa valeur dépend de l’âge maximum observé dans le data set.
proc sql; *noprint;
select case
when max(age) > 13 then ‘>13’
when max(age) >= 0 then ‘[0-13]’
else ‘N/A’
end into :pop
from sashelp.class;
quit;