Conseils de programmation SAS

Solution de remplacement pour le mot interdit PUT

Solution de remplacement pour le mot interdit PUT

Le mot PUT n'est pas autorisé dans le système d'accès à distance en temps réel (ADTR), car l'énoncé PUT permet à un utilisateur d'écrire des valeurs à partir des microdonnées dans le journal SAS. Toutefois, les utilisateurs pourraient vouloir utiliser la fonction PUT pour créer des valeurs de type caractère en appliquant un format (habituellement utilisé pour convertir des valeurs numériques en caractères). Comme le mot PUT n'est pas autorisé, les utilisateurs peuvent utiliser à la place les fonctions PUTC ou PUTN, qui sont semblables à la fonction PUT. PUTC permet de créer une valeur de type caractère en appliquant un format de type caractère. PUTN permet de créer une valeur de type caractère en appliquant un format numérique.

Note : Contrairement au format pour la fonction PUT, le format à appliquer (le deuxième argument) pour les fonctions PUTC et PUTN doit être entre guillemets. Par exemple :

AgeChar = PUTN(Age, "3.");

Conversion des valeurs de type caractère en valeurs numériques

Conversion des valeurs de type caractère en valeurs numériques

Dans certains cas, l'utilisateur peut vouloir convertir des valeurs de microdonnées de type caractère en valeurs numériques. Par exemple, la variable de microdonnées SP_WEARN de l'Enquête sur la population activeest une variable de type caractère. Pour cette raison, SP_WEARN ne peut pas être utilisée comme variable d'analyse statistique dans l'ADTR (dans RTRAMean, par exemple). Elle doit d'abord être convertie en variable numérique. Cette conversion peut être effectuée en utilisant la fonction INPUT.

Dans l'exemple ci-dessous illustrant l'étape des données , une nouvelle variable numérique SP_WEARN_NUM est créée en appliquant la fonction INPUT à SP_WEARN. On suppose que les valeurs dans SP_WEARN comportent deux décimales implicites.

data work.LFS;

   set RTRAData.LFS200005 ;

   length SP_WEARN_NUM 8;

   SP_WEARN_NUM = INPUT(SP_WEARN,7.2);

run;

La nouvelle variable SP_WEARN_NUM peut alors être utilisée comme variable d'analyse dans les procédures d'ADTR.

Application de l'option KEEP à l'ensemble de données RTRAData

Application de l'option KEEP à l'ensemble de données RTRAData

L'application de l'option KEEP à l'ensemble de données RTRAData peut rendre l'étape de données plus efficace, car SAS n'extraira que les variables figurant dans la liste KEEP. Cette option est utile lorsque seul un petit nombre de variables doivent être conservées. Veuillez prendre note que si l'option KEEP est précisée, la variable nommée ID doit être incluse dans la liste de variables.

Par exemple :

data work.CSDDis;

   set RTRAData.csd2012_disab(keep=DDIS_FL REF_AGE SEX DCLASS DLFS ID);

run;

Note : Même si l'option KEEP peut rendre l'étape des données plus efficace lorsque seul un petit nombre de variables sont nécessaires, elle n'est pas obligatoire. S'il est nécessaire de conserver un grand nombre de variables, il est plus facile d'omettre l'option KEEP. SAS conservera alors automatiquement toutes les variables (y compris la variable ID).

Définition de nouvelles variables au moyen d'un énoncé LENGTH

Définition de nouvelles variables au moyen d'un énoncé LENGTH

L'exemple ci-dessous montre la façon dontles valeurs d'une nouvelle variable de type caractère peuvent être tronquées par inadvertance lorsque la variable n'est pas définie au moyen d'un énoncé LENGTH.

data work.CSDDis;

    set RTRAData.csd2012_disab;

    if (REF_AGE < 10) then AgeGroup = "Under10";

    else if (10 <= REF_AGE <= 30) then AgeGroup = "Between10and30";

    else if (31 <= REF_AGE <= 90) then AgeGroup = "Between31and90";

    else if (REF_AGE > 90) then AgeGroup = "OlderThan90";

   else AgeGroup = "AgeUnknown";

run;

Comme la nouvelle variable AgeGroup n'est pas définie au moyen d'un énoncé LENGTH, SAS utilise la première occurrence de AgeGroup à l'étape des données pour déterminer la longueur de caractères à attribuer à la variable. La première occurrence est l'endroit où AgeGroup se voit attribuer la valeur « Under10 ». Par conséquent, SAS attribue une longueur de 7 à la variable AgeGroup. Le problème est alors que la longueur 7 n'est pas suffisante pour recevoir les valeurs de caractères attribuées à AgeGroup plus tard dans l'étape de données, telles que « Between10and30 » (entre 10 et 30).

Voici les valeurs de AgeGroup à l'étape des données de sortie pour les différents groupes d'âge. Veuillez prêter attention à la troncature qui a eu lieu :

Définition de nouvelles variables avec un énoncé LENGTH
REF_AGE AgeGroup [char(7)]
< 10 Under10
10 - 30 Between
31 - 90 Between
> 90 OlderTh
Any other value AgeUnkn

Si AgeGroup est une variable de classe les valeurs dans les résultats totalisés seront tronquées, comme il est indiqué ci-dessus. En outre, ce qui est encore pire, toutes les valeurs REF_AGE de 10 à 90 se retrouveront dans la même catégorie, à savoir « Between  ».

Pour éviter ce problème, utilisez un énoncé LENGTH pour attribuer une longueur suffisante à AgeGroup avant de lui attribuer une valeur :

data work.CSDDis;

   set RTRAData.csd2012_disab;

   length AgeGroup $ 15;

   if (REF_AGE < 10) then AgeGroup = "Under10";

   else if (10 <= REF_AGE <= 30) then AgeGroup = "Between10and30";

   else if (31 <= REF_AGE <= 90) then AgeGroup = "Between31and90";

   else if (REF_AGE > 90) then AgeGroup = "OlderThan90";

   else AgeGroup = "AgeUnknown";

run;

Définition de nouvelles variables avec un énoncé LENGTH
REF_AGE AgeGroup [char(15)]
< 10 Under10
10 - 30 Between10and30
31 - 90 Between31and90
> 90 OlderThan90
Any other value AgeUnknown
Énoncé ELSE manquant lors de la définition d'une variable dérivée

Énoncé ELSE manquant lors de la définition d'une variable dérivée

Lors de la définition d'une variable dérivée dans une étape de données, les énoncés IF/ELSE sont habituellement utilisés.

Par exemple :

data work.CSDDis;

   set RTRAData.csd2012_disab;

   length AgeGroup $ 15;

   if (0<= REF_AGE < 10) then AgeGroup = "Under10";

   else if (10 <= REF_AGE <= 30) then AgeGroup = "Between10and30";

   else if (31 <= REF_AGE <= 90) then AgeGroup = "Between31and90";

   else if (91 <= REF_AGE <= 120) then AgeGroup = "Between91and120";

run;

Le problème potentiel avec ce code est qu'il ignore toute valeur spéciale de REF_AGE qui peut exister dans les données. Par exemple, l'ensemble de données csd2012_disab peut contenir des valeurs manquantes REF_AGE (.) ou une valeur comme 999 peut représenter « Not Stated ». Pour les observations où REF_AGE n'est pas de 0 à 120, AgeGroup restera vide. Si AgeGroup est utilisé comme variable de classe dans l'ADTR, l'ADTR produira un message d'erreur puisqu'une variable de classe ne peut pas avoir de valeurs manquantes.

Pour éviter ce problème, un énoncé ELSE supplémentaire tel que « catch all » (qui permet d'englober toutes les valeurs) devrait être utilisé. Cela permet de s'assurer que AgeGroup ne sera pas vide dans les observations de l'ensemble de données de sortie.

data work.CSDDis;

   set RTRAData.csd2012_disab;

   length AgeGroup $ 15;

   if (0<= REF_AGE < 10) then AgeGroup = "Under10";

   else if (10 <= REF_AGE <= 30) then AgeGroup = "Between10and30";

   else if (31 <= REF_AGE <= 90) then AgeGroup = "Between31and90";

   else if (91 <= REF_AGE <= 120) then AgeGroup = "Between91and120";

   else AgeGroup = "Other";

run;

Dans l'exemple ci-dessus, pour toutes les observations où REF_AGE n'est pas de 0 à 120, une valeur « Other » sera attribuée à AgeGroup.

Date de modification :