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 :

Identifier les évolutions de note : macro SAS


Sujet :

Macro

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut Identifier les évolutions de note : macro SAS
    Bonjour,

    J’ai un tableau avec différents identifiants et à chaque identifiant correspond plusieurs notations avec des dates différentes :

    Id Note1 date1 Note2 date2 Note3 date3 Nbre
    x1 8 10/2008 10 09/2009 15 03/2010 3
    x2 12 08/2008 8 07/2009 2
    x3 11 03/2008 7 04/2009 12 12/2010 3
    x4 14 11/2009 14 10/2010 2


    Une variable « Nbre » a été constituée afin de compter le nombre de notations existantes. Ex : pour l’identifiant « x1 », il exsite 4 notations, pour l’identifiant « x2 » il existe 3 notations…

    J’aimerais pouvoir :
    1. Comparer la première notation Note1 avec la dernière notation Note ‘i’ (tout dépend du nombre de notation par identifiant). J’aimerais créer une variable reprenant 4 cas possibles :
    a) La note reste au dessus de la moyenne : Les deux notes sont compris dans l’intervalle suivant : (10,11,12,13,14,15,16,17,18,19,20) (exemple : Id "x1")
    b) La note passe en dessous de la moyenne : La première note appartient à l’intervalle (10,11,12,13,14,15,16,17,18,19,20) et la deuxième note appartient à l’intervalle (0,1,2,3,4,5,6,7,8,9) (exemple : Id "x2")
    c) La note passe au dessus de la moyenne : La première note appartient à l’intervalle (0,1,2,3,4,5,6,7,8,9) et la deuxième note appartient à l’intervalle (10,11,12,13,14,15,16,17,18,19,20)
    d) La note reste en dessous de la moyenne : Les deux notes sont compris dans l’intervalle suivant : (0,1,2,3,4,5,6,7,8,9)

    2. Pouvoir analyser, lorsque la variable précédemment définie renvoie « la note reste à la moyenne » si, dans les notations intermédiaires (de note2 à note (i-1) ), il y a des notes qui sont en « dessous de la moyenne » exemple : Id "X3". De la même manière lorsque la variable renvoie la valeur « la note reste en dessous de la moyenne » j’aimerais savoir si des notes intermédiaires ( de Note2 à Note (i-1) ) prennent une valeur supérieure à la moyenne ?

    Je pense qu’il me faudrait faire une boucle

    do i =2 to (Nbre – 1) ;
    If variable = « la note reste à la moyenne » and Nori in (0,1,2,3,4,5,6,7,8,9) then suivi_intermédiaire = j+1 ;
    End ;

    Cependant, je ne sais pas trop comment utiliser « Nbre » comme variable dynamique…
    Par ailleurs, il peut y avoir un nombre indéterminée de notations pour un me^me identifiant...

    Merci d’avance pour votre aide.

  2. #2
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Je pense que ta table aurait du être en ligne et non en colonne pour pouvoir utiliser les procédures d'aggrégations et les pointeurs.

    Voici une illustration de la réponse à ta question 1. Je n'ai pas d'idée précise pour la Q2. Il faudrait essayer autour de ce que je t'ai donné.

    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
    data test;
    infile datalines dsd dlm='|' missover;
    input
    Id :$2. Note1 :8. date1 :anydtdte10. 
    Note2 :8. date2 :anydtdte10. Note3 :8. date3 :anydtdte10. Nbre :8.;
    format da: date9. ;
    datalines;
    x1|8|01/10/2008|10|01/09/2009|15|01/03/2010|3
    x2|12|01/08/2008|8|01/07/2009|||2
    x3|11|01/03/2008|7|01/04/2009|12|01/12/2010|3
    x4|14|01/11/2009|14|01/10/2010|||2
    ;run;
     
    proc format ;
    value li
    1= La note reste au dessus de la moyenne 
    2= La note passe en dessous de la moyenne 
    3= La note passe au dessus de la moyenne 
    4= La note reste en dessous de la moyenne 
     
    ;run;
     
    data test2;
    set test;
    length first last 8. ;
    array no (*) note: ;
    first=no(1);
    do i = 1 to dim(no);
    if no(i) ne . then last=no(i);
    end;
     
    if first in (10,11,12,13,14,15,16,17,18,19,20) and last in (10,11,12,13,14,15,16,17,18,19,20) then comment = 1;
    if first in (10,11,12,13,14,15,16,17,18,19,20) and last in (0,1,2,3,4,5,6,7,8,9) then comment = 2;
    if first in (0,1,2,3,4,5,6,7,8,9) and last in (10,11,12,13,14,15,16,17,18,19,20) then comment = 3;
    if first in (0,1,2,3,4,5,6,7,8,9) and last in (0,1,2,3,4,5,6,7,8,9) then comment = 4;
     
    do j=2 to dim(no)-1;
     
    moy = MEAN(of no(j) );
    end; 
     
    drop i ;
    format comment li. ;
    run;
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    + 1 :
    Citation Envoyé par datametric Voir le message
    ta table aurait du être en ligne et non en colonne

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    Bonsoir,

    Merci beaucoup de votre réponse.

    Lorsque j’exécute le code,
    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
     
    proc format ;
    value li
    1= La note reste au dessus de la moyenne 
    2= La note passe en dessous de la moyenne 
    3= La note passe au dessus de la moyenne 
    4= La note reste en dessous de la moyenne 
     
    ;run;
     
    DATA test2;
    SET test;
    length first last 8. ;
    array no (*) note: ;
    first=no(1);
    do i = 1 TO dim(no);
    IF no(i) ne . then last=no(i);
    end;
     
    IF first IN (10,11,12,13,14,15,16,17,18,19,20) AND last IN (10,11,12,13,14,15,16,17,18,19,20) then comment = 1;
    IF first IN (10,11,12,13,14,15,16,17,18,19,20) AND last IN (0,1,2,3,4,5,6,7,8,9) then comment = 2;
    IF first IN (0,1,2,3,4,5,6,7,8,9) AND last IN (10,11,12,13,14,15,16,17,18,19,20) then comment = 3;
    IF first IN (0,1,2,3,4,5,6,7,8,9) AND last IN (0,1,2,3,4,5,6,7,8,9) then comment = 4;
     
    DROP i ;
    format comment li. ;
    run;
    je n’obtiens pas tout à fait le résultat escompté :
    En effet, le code me renvoie les résultats suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Id  Note 	date 		Nbre	Comment
    X1 12	01/10/2008	2	reste au dessus de la moyenne
    X1 8	01/08/2009	2	reste en dessous de la moyenne
    X2 8	01/05/2008	2	reste en dessous de la moyenne
    X2 7	01/07/2009	2	reste en dessous de la moyenne
    X3 7	01/01/2008	3	reste en dessous de la moyenne
    X3 10	01/10/2009	3	reste au dessus de la moyenne
    X3 14	01/08/2010	3	reste au dessus de la moyenne
    Alors que je préfèrerais obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Id  Note 	date 		Nbre	Comment
    X1 12	01/10/2008	2	passe en dessous de la moyenne
    X1 8	01/08/2009	2	passe en dessous de la moyenne
    X2 8	01/05/2008	2	reste en dessous de la moyenne
    X2 7	01/07/2009	2	reste en dessous de la moyenne
    X3 7	01/01/2008	3	passe au dessus de la moyenne
    X3 10	01/10/2009	3	passe au dessus de la moyenne
    X3 14	01/08/2010	3	passe au dessus de la moyenne
    Sauriez-vous ce qui pourrait être modifié pour obtenir le résultat escompté ?

    Merci d'avance.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Je me demandais, si on considère le tableau suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Id Note1 date1      Note2 date2     Note3 date3     Nbre
    x1 8       10/2008   10     09/2009  15      03/2010  3
    x2 12      08/2008   8      07/2009  2
    x3 11      03/2008   7      04/2009  12      12/2010  3
    x4 14      11/2009   14    10/2010  2
    Ne pourrait-on pas faire une fonction du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    data test1;
    set test;
    length comment $2;
    %let i = nombre;
    if Note1 in (10,11,12,13,14,15,16,17,18,19,20) and Note&i in (10,11,12,13,14,15,16,17,18,19,20) then comment = "Reste au dessus de la moyenne";
    etc...
    run;
    Le seul problème, c'est qu'il faudrait que i prenne, pour chaque ligne, la valeur de la variable "nombre" exemple : 3, 2 etc... car cela me permettrait ainsi de comparer Note1 avec la Note2, Note3 etc...

    Savez-vous si c'est possible de faire quelque chose de ce type en SAS ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    essaye de suivre ce commentaire :

    ta table aurait du être en ligne et non en colonne
    tu verras qu'ensuite tout sera plus facile

  7. #7
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    tibss, modifie le programme que je t'ai fourni. Je ne vois pas bien pourquoi il ne répond pas à tes besoins mais en le décortiquant tu apprendras à manipuler de simples ARRAY.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Discussions similaires

  1. formule ou macro pour identifier les doublons
    Par TICHKA dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/02/2014, 12h43
  2. Macro pour identifier les niveau de mise en forme
    Par skaven the shaman dans le forum VBA Word
    Réponses: 13
    Dernier message: 09/10/2010, 10h31
  3. Réponses: 1
    Dernier message: 08/12/2008, 12h13
  4. Identifier les enregistrements Lu d'une table
    Par aityahia dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/03/2006, 18h50
  5. Réponses: 1
    Dernier message: 17/06/2005, 10h35

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