Annonce

Bienvenue sur le site support de mes ouvrages d'introduction à SAS

La 4ème édition de mon ouvrage est disponible depuis le 11 avril 2019 !

Où trouver cet ouvrage ?


#1 18-03-2015 09:19:23

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

[archive] Plein d'options de table...

Bonjour

Saffi a posté la semaine dernière une question dans le forum de discussions et cette question me permet de votre proposer ce sujet des "beaux mercredis". Son problème était assez courant : il dispose de deux tables qu'il veut fusionner au moyen d'une instruction MERGE. Cette fusion ne fonctionne pas parce que la variable clé est caractère dans une des tables et numérique dans l'autre (c'est un problème que j'évoquais dans l'édition 2  (section 4.2.4) - je dois certainement aussi en parler dans l'édition 3 mais je n'arrive pas à retrouver où...).

bref...

voici un programme proche de celui que je lui ai proposé :

Code:

data toto;
input an $10. x1;
cards;
2005      5
2006      6
2007      7
2008      8
;

data titi;
input an x2;
cards;
2005  12
2006  13
2007  14
;

data toto(drop=an rename=(t=an));
  set toto;
  t=input(an,4.);
run;

data ensemble;
   merge toto titi;
   by an;
run;

Ce programme, bien entendu, permet la fusion des tables TITI et TOTO.

Je souhaite attirer votre attention sur les options de table qui apparaissent dans l'étape DATA de modification de la table TOTO :

Code:

data toto(drop=an rename=(t=an));

je demande, au moyen de ces options de table de supprimer la variable AN et de renommer le variable T en AN. La question est :
"mais dans quelle ordre ces deux demandes vont être effectuées ?"


L'ordre est en effet important puisque si le RENAME est effectué en premier, je demande que T (variable numérique) soit renommé en AN mais il existe déjà une variable AN dans la table TOTO : le programme va générer un message d'avertissement dans le journal :

Code:

WARNING: Impossible de renommer la variable t en an car an existe déjà.

Si mon programme fonctionne, c'est donc que l'action de DROP= a été prise en compte en premier - il n'y a donc plus de variable AN - on peut alors renommer T en AN.

Pour la semaine prochaine, vous allez réfléchir à cette première question :
"pourquoi suis-je sûr que l'action de DROP est effectuée en premier ?"


Je vous donne un indice : ce n'est pas parce que DROP= apparaît en premier parmi les options de table mobilisées - intervertissez DROP= et RENAME= :

Code:

data toto(rename=(t=an) drop=an);

vous obtiendrez le même résultat...

Si vous trouvez la bonne réponse à la première question, alors vous trouverez la réponse à la question suivante :

Dans la table TOTO, vous avez une observation relative à 2008 - je souhaite, au moyen d'une option de table WHERE= supprimer cette observation. Cette option de table doit s'ajouter aux options de table DROP= et RENAME=.

Quelle est la bonne option de table à ajouter aux deux options de table déjà présentes :

1- WHERE=(T ne 2008)
2- WHERE=(T ne "2008")
3- WHERE=(AN ne 2008)
4- WHERE=(AN ne "2008")

Vous devez être capable, si vous avez répondu correctement à la question n°1 de m'indiquer non seulement pourquoi l'option de table WHERE= doit prendre cette forme mais aussi pourquoi les autres options de table WHERE ne peuvent pas fonctionner.


Je tiens à remercier publiquement Katia qui (il y a bien longtemps - s'en souvient-elle encore...?) m'a suggéré de construire un petit exercice sur ce thème ;-)

Amusez vous bien (toujours avec SAS !)

Ce sujet est maintenant archivé - seuls les utilisateurs inscrits de www.sas-sr.com peuvent consulter l'intégralité du sujet et les réponses aux questions posées.
pour vous identifier, suivez ce lien
pour vous inscrire, suivez ce lien

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr
Flux RSS