IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macro Discussion :

Ecriture de modification dans une table


Sujet :

Macro

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 27
    Par défaut Ecriture de modification dans une table
    Bonjour,
    je fais actuellement de l'analyse des correspondances multiples avec SPAD. Souhaitant utiliser SAS, j'essaie d'adapter mon analyse.
    Pour commencer, je souhaite 'ventiler' les modalités de certaines variables ayant de faibles effectifs. j'ai réalisé une macro censée le faire, que j'ai d'ailleurs partagée un peu vite sur le forum developpez.
    Elle le fait, à en juger par les tableaux croisés de vérification, mais je ne comprends pas pourquoi les modalités ne sont pas remplacées en dur dans la table...
    Est-ce que vous voyez l'erreur? Je ne la trouve pas...
    Merci de votre aide!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    %macro remplacer_modalites(seuil=,table_source=,table_sortie=,list_varact=);
    %macro zut; %mend zut;
     
    /* ces lignes comptent le nombre de variables actives de la liste */
    %global count;
    %let count=0;
    %do %while(%qscan(&list_varact,&count+1,%str( )) ne %str());
    %let count = %eval(&count+1); 
    %end;
    %put Il y a donc &count variables actives. La liste en est "&list_varact";
     
    /* puis on execute le programme pour chacune d'entre elle */
    %do z=1 %to &count;
    	%let varact=%scan(&list_varact,&z,' ');
        %put La variable active traitée est "&varact"; 
    /* STOP - Jusqu'ici, on peut travailler sur chacune des variables appelées par la MV &varact */
     
    	proc freq data=&table_source;
    		table &varact / missing out=freq_&varact;
    	run; quit;
     
    /* Création de la liste des modalités à conserver intactes */
    %global list_modcons nbmodcons;
    %let list_modcons="";
    proc SQL NOPRINT;
    SELECT QUOTE(COMPRESS(&varact)) INTO: list_modcons SEPARATED BY ',' FROM freq_&varact WHERE percent > &seuil;
    quit;
    %let nbmodcons = &sqlobs;
    %put Pour la variable &varact, la liste des modalités à conserver est (&list_modcons);
    %put Il y en a &nbmodcons;
     
    /* Création de la liste des modalités à remplacer */
    %global list_modelim nbmodelim;
    %let list_modelim=""; %let nbmodelim=0;
    proc SQL NOPRINT;
    SELECT QUOTE(COMPRESS(&varact)) INTO: list_modelim SEPARATED BY ',' FROM freq_&varact WHERE &varact not in (&list_modcons);
    quit;
    %let nbmodelim = &sqlobs;
    %if &nbmodelim>0 %then %do;
    	%put Pour la variable &varact, la liste des modalités à éliminer est (&list_modelim);
    	%put Il y en a &nbmodelim;
    	%end;
    	%else %do;
    	%put "Il n'y a aucune modalité à éliminer pour la variable" &varact;
    	%end;
     
    /* Création des modalités remplaçantes */
    data _null_; set freq_&varact; 
    where &varact in (&list_modcons);
    call symputx(compress("modcons"!!_N_),&varact);
    run;
     
    /* Boucle pour chacune des modalités à remplacer */
    %if &nbmodelim>=1 %then %do;
    data &table_sortie; set &table_source;
    	x=rand('uniform');
    	%do y=1 %to &nbmodcons;
    		if &varact in (&list_modelim) and %sysevalf((&y-1)/&nbmodcons)<=x<=%sysevalf(&y/&nbmodcons) then do;
    			&varact.a = "&&&modcons&y"; /* pour tableau croisé de vérification */
    			&varact = "&&&modcons&y";
    		end;
    	%end;
    	drop x;
    run;
    %put _user_;
    %end;
     
     
    proc freq data=&table_sortie; table &varact*&varact.a / missing; run; quit;
    %end;
    %mend remplacer_modalites;
     
    %remplacer_modalites(
    table_source=acmv2,
    table_sortie=out,
    seuil=3,
    list_varact=
    aepp areso aenseign acmu apatvi aenf atpsjw 
    anbjw avacan aperm ardv agroup ainfo aechmg aechms aechin 
    asoll amepspe adiver
    );

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Par défaut
    Bonjour,

    C'est un peu compliqué ce que tu demandes.
    Est ce que tu peux nous fournir un jeu de donnée pour vérifier le programme?

    Cordialement

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 27
    Par défaut
    En fait j'ai trouvé le problème, j'écrasais ma table à chaque boucle... ce qui n'aidais pas à conserver les modifications faites à la fin de la macro
    je ne sais pas comment supprimer le message (j'ai fait délester, mais il apparaît encore...)
    Merci en tout cas pour ta réponse!

  4. #4
    Membre Expert

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Par défaut
    Ok bon courage, tu utilises un append pour empiler les différents résultats?

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 27
    Par défaut
    Euh... je suis plus touriste que professionnel en informatique comme le laisse entendre le forum... et je ne sais pas trop ce qu'est un append...
    Pour mon problème, je copie la table initiale dans une autre (je ne travailles pas sur beaucoup de données) et c'est sur cette autre que je fais tourner la macro (pour conserver les données originales, au cas où je n'aurais pas de sauvegarde)! J'ai modifié le post dans le forum 'partagez vos macros' si je ne suis pas clair...
    C.

  6. #6
    Membre Expert
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Par défaut
    A ce que je comprends de ton problème, ton problème vient du fait que tu effectues une boucle et les informations de l'itération précédente est écrasée par l'itération en cours.

    D'où l'idée d'accumuler l'information de l'itération encours aux informations précédentes. Créer une table finale, initialement vide, puis à chaque itération mettre à jour la table finale en y ajoutant les informations de l'itération.

    La mise à jour peut se faire par une étape data:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data finale;
    set finale etapeencours;
    ....
    run;
    ou par une proc append (prévue à cet affet)

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 27
    Par défaut
    Aaah, d'accord j'ai compris.
    En fait je souhaitais initialement créer une table post-traitement de données différente de la table initiale, pour être certain de ne pas perdre les données. J'ai finalement choisi l'option:
    1. copie de la table source
    2. travail sur la copie, avec écriture des différentes itérations dedans.

    j'esaierai la proc append (que je ne connais pas)!

    merci

  8. #8
    Membre Expert

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Par défaut
    La proc append sert à concaténer les tables, elle économise les temps de traitement.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc append base=principale data=table_ajouter; run;
    La proc append ne lit que la deuxième table à la différénce de l'étape data
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data principale;
    set principale table_ajouter;
    run;
    qui nécessite la lecture des deux tables.

  9. #9
    Membre Expert
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Par défaut
    Tout à fait d'accord, je ne suis pas étendu sur ce point vu que tarlito mentionne qu'il à peu de données et donc le temps de traitement n'est pas un problème apparemment. La proc append est plus optimisée mais ne permets pas d'effectuer des traitements supplémentaires.

    Par contre, étape data ou proc append, attention à la concaténation de données lorsque la variable en question à des caractéristiques dfférentes dans les deux tables entrée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modification dans une Table
    Par JMMEDIA dans le forum Modélisation
    Réponses: 1
    Dernier message: 30/11/2008, 13h26
  2. ajouter automatiquement la date de modif dans une table?
    Par Nadaa dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/10/2007, 03h45
  3. suivre modifications dans une table
    Par wachoo31 dans le forum Modélisation
    Réponses: 2
    Dernier message: 08/09/2007, 08h57
  4. détecter des modifications dans une table Firebird
    Par DAGADA dans le forum Bases de données
    Réponses: 1
    Dernier message: 15/05/2007, 10h05
  5. modification dans une table paradox
    Par stefano dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/01/2007, 22h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo