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 :

Macro pour compter le nombre d'enregistrements par patient


Sujet :

Macro

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Macro pour compter le nombre d'enregistrements par patient
    Voila mon problème :

    J'ai la table suivant

    Patient diag1 diag2 diag3 diag4
    01 A A A B
    02 A B B B
    03 A A C C
    04 A B C C

    J'aimerais obtenir la table suivante qui compte les diagnostics par patients et par type en créant une macro.

    Patient diag1 diag2 diag3 diag4 Nom_diag1 Nb_diag1 Nom_diag2 Nb_diag2
    01 A A A B A 3 B 1
    02 A B B B B 4 - .
    03 B B B A B 3 A 1


    Pour cela j'ai recuper dans 2 macros variables le nombre total de diagnostic (nb_diag) et le nombre différent de diagnostic (diag_diff). Je voulais utiliser ces 2 valeurs pour faire 2 boucles. Un allant de 1 à diag_diff et l'autre allant de 2 à nb_diag mais si je suis ici c'est que c'est un echec.

    Est ce que quelqu'un aurait une petite idée ??
    Merci.
    une allant de 1 au nombr

  2. #2
    Membre régulier
    Homme Profil pro
    SAS automation
    Inscrit en
    Juin 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : SAS automation
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 87
    Points : 84
    Points
    84
    Par défaut
    Salut,

    Voici un code qui pourrais peut être t'aider au final je créer trois autres variables qui prenne pour la valeut le nombre de diagnostique.

    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
     
    data table01;
    	attrib patient format=$2.
    		    diag1 diag2 diag3 diag4 format=$1.;
    	input patient diag1 diag2 diag3 diag4;
    	cards;
    01 A A A B
    02 A B B B
    03 A A C C
    04 A B C C
    ;
    run;
     
    data table02;
    	set table01;
    	array num_diag(4) $ diag1-diag4;
    		nb_diag_A=0;
    	nb_diag_B=0;
    	nb_diag_C=0;
    	do i=1 to dim(num_diag);
    	retain nb_diag_A nb_diag_B nb_diag_C;
    	if num_diag(i)='A' then nb_diag_A=nb_diag_A+1;
    	else if num_diag(i)='B' then nb_diag_B=nb_diag_B+1;
    	else if num_diag(i)='C' then nb_diag_C=nb_diag_C+1;
    	end;
    run;

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup pour cette réponse qui fonctionne trés bien pour l'exemple que j'ai proposé.

    Mais mon but est de généralisé cela à un nombre trés important de diagnostics et de patients.
    Voila la macro surlaquelle je bute.
    Je n'arrive pas a trouver la boucle correcte de la 2eme partie.

    Merci pour 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
     
     
    DATA table01;
    	input patient $ 1-2 dp_1 $ 4 dp_2 $ 6 dp_3 $ 8 dp_4 $ 10 NB_DP  12 ;
    	DATALINES;
    01 A B C D 4
    02 A B B   3
    03 A B C C 4
    04 A A     2
    05 A       1
    ;
    run;
     
     
     
     
    %macro compteur(tabin,tabout,maxdiag);
     
    /*Partie1:Création des macro variables:Cette partie fonctionne*/
    /*On crée le nombre max de diagnostic différent*/
    data temp1;set &tabin;
    dp_diff=0;
    %do i=1 %to &maxdiag;
    %let j=%eval(&i+1);
    if dp_&i.=dp_&j. then dp_diff=dp_diff;
    else  dp_diff=dp_diff+1;
     
    %end;
    %let maxp1=%eval(&maxdiag.+1);
    drop dp_&maxp1.;
    run;
     
    /*On affecte les valeurs max*/
    proc sql noprint;
    SELECT max(dp_diff) INTO: max_dp_diff FROM temp1;
    quit;
     
    %put Le nombre max de diagnostic EST = &maxdiag.;
    %put Le nombre max de diagnostic différent EST = &max_DP_diff.;
     
     
    /*Partie 2:Création de la table de sortie*/
     
    data &tabout;
    set temp1;
     
    NB_DP_1=1; /*Tous le monde a au moins 1 diagnostic*/
    Diff1=0;  /*Variable pour la position du diagnostic*/
     
     
    %do k=1 %to &max_DP_diff.
     
    	%do i=2 %to &maxdiag.;
     
    		if DP_&i=DP_&k then NB_DP_&k=NB_DP_&k+1;else NB_DP_&k=NB_DP_&k;
    		nom_DP_X&k=DP_1;
     
    	%end;
    %end;
     
     
    run;
    %mend;
     
    %compteur(table01,table02,4);

  4. #4
    Membre régulier
    Homme Profil pro
    SAS automation
    Inscrit en
    Juin 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : SAS automation
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 87
    Points : 84
    Points
    84
    Par défaut
    Bonjour,

    j'ai une question à quoi correspond ta macro variable &max_NB_DP, car je ne la vois pas initialisée dans ton code.

    merci

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Oui tu as raison.

    Elle n'etait pas initialisé et correspondait en fait à maxdiag (initialisé dans les parametres de la macro, ici sa valeur est 4).

    Merci.

  6. #6
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Je ne suis pas certain qu'on ait forcément besoin de macros ici. Des transpositions seraient plus simples à programmer (à mon avis).
    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
    DATA work.boucheen ;
      INPUT Patient $ (diag1 diag2 diag3 diag4) (:$1.) ;
    DATALINES ;
    01 A A A B
    02 A B B B
    03 A A C C
    04 A B C C
    ;
    RUN ;
    PROC TRANSPOSE DATA=work.boucheen OUT=work.pivot ;
      VAR diag: ;
      BY patient ;
    RUN ;
    PROC SQL ;
      CREATE TABLE work.pivot2 AS
        SELECT patient, col1, COUNT(*) AS nb
    	FROM work.pivot
    	GROUP BY patient, col1
      ;
    QUIT ;
    PROC TRANSPOSE DATA=work.pivot2 OUT=work.diag PREFIX=nom_diag ;
      BY patient ;
      VAR col1 ;
    RUN ;
    PROC TRANSPOSE DATA=work.pivot2 OUT=work.nb PREFIX=nb_diag ;
      BY patient ;
      VAR nb ;
    RUN ;
    DATA work.resultat ;
      MERGE work.diag work.nb ;
      BY patient ;
    RUN ;
    Bon courage.
    Olivier
    Bon courage.
    Olivier

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci olivier pour cette réponse.

    Cela fonctionne bien et évite en effet un temps calcul à rallonge.

    Pour que cela fonctionne avec des valeurs manquante comme pour la table en xemple ci-dessous , il faut supprimer les ligne de work.pivot pour lesquelles la valeur de COL1 est manquante.

    Voila le code final qui fonctionne.

    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
     
    DATA work.boucheen1;
    	input patient $ 1-2 diag1 $ 4 diag2 $ 6 diag3 $ 8 diag4 $ 10  ;
    	DATALINES;
    01 A B C D 4
    02 A B B   3
    03 A B C C 4
    04 A A     2
    05 A       1
    ;
    run;
     
     
    PROC TRANSPOSE DATA=work.boucheen1 OUT=work.pivot ;
      VAR diag: ;
      BY patient;
    RUN ;
     
    PROC SQL ;
      CREATE TABLE work.pivot2 AS
        SELECT patient, col1, COUNT(*) AS nb
    	FROM work.pivot
    	GROUP BY patient, col1
      ;
    QUIT ;
     
    data work.pivot3;set work.pivot2;if col1="" the delete;run;
     
    PROC TRANSPOSE DATA=work.pivot3 OUT=work.diag PREFIX=nom_diag ;
      BY patient;
      VAR col1 ;
    RUN ;
     
    PROC TRANSPOSE DATA=work.pivot3 OUT=work.nb PREFIX=nb_diag ;
      BY patient;
      VAR nb ;
    RUN ;
     
    DATA work.resultat ;
      MERGE work.diag work.nb ;
      BY patient;
    RUN ;
    Merci a tous pour votre temps et vos réponse.

  8. #8
    Membre régulier
    Homme Profil pro
    SAS automation
    Inscrit en
    Juin 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : SAS automation
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 87
    Points : 84
    Points
    84
    Par défaut
    Bonjour,

    la méthode d'Olivier semble effectivement plus rapide si vraiment tu veux par macro j'ai modifié ton code en rajoutant un étape d'initialisation de variables pour le calcul
    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
     
     
    /*Partie1:Création des macro variables:Cette partie fonctionne*/
    DATA table01;
    	input patient $ 1-2 dp_1 $ 4 dp_2 $ 6 dp_3 $ 8 dp_4 $ 10 NB_DP  12 ;
    	DATALINES;
    01 A B C D 4
    02 A B B   3
    03 A B C C 4
    04 A A     2
    05 A       1
    ;
    run;
     
     
    %macro compteur(tabin,tabout,maxdiag);
     
    /*On crée le nombre max de diagnostic différent*/
    DATA temp1;SET &tabin;
    dp_diff=0;
    %do i=1 %TO &maxdiag;
    %let j=%eval(&i+1);
    IF dp_&i.=dp_&j. then dp_diff=dp_diff;
    else  dp_diff=dp_diff+1;
     
    %end;
     
    %let maxp1=%eval(&maxdiag.+1);
    DROP dp_&maxp1.;
    run;
     
    /*On affecte les valeurs max*/
    proc sql noprint;
    SELECT max(dp_diff) INTO :max_dp_diff FROM temp1;
    quit;
     
    %put Le nombre max de diagnostic EST = &maxdiag.;
    %put Le nombre max de diagnostic différent EST = &max_DP_diff.;
     
     
     
     
     
    /*Partie 2:Création de la table de sortie*/
     
     
    DATA &tabout.;
    	SET temp1;
     
    	NB_DP_1=1; /*Tous le monde a au moins 1 diagnostic*/
    	Diff1=0;  /*Variable pour la position du diagnostic*/
     
     %do k=1 %to &max_dp_diff.;
    IF DP_&k. = '' then NB_DP_&k.=0; else NB_DP_&k.=1;
     nom_DP_X&k.=DP_&k.;
     
    %do i=%eval(&k.+1) %TO &maxdiag.;
    		IF DP_&i.=DP_&k. then NB_DP_&k.=NB_DP_&k.+1;
    				else NB_DP_&k.=NB_DP_&k.;
     
     
    	%end;
     
    %end;
     
    run;
     
     
    %mend;
    %compteur(table01,table02,4);

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci elcocco pour ta réponse.

    La macro que tu propose fonctionne bien avec cet exemple.

    Elle a comme limite que si les 2 premiers diagnostics sont identiques (cf exemple: ligne 4) de recommencer à partir du 2 eme de donc de donner A et 2 comme respectivement nom et nombre de diagnostic pour le 2eme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DATA table01;
    	input patient $ 1-2 dp_1 $ 4 dp_2 $ 6 dp_3 $ 8 dp_4 $ 10 NB_DP  12 ;
    	DATALINES;
    01 A B C D 4
    02 A B B   3
    03 A B C C 4
    04 A A A C 4
    05 A       1
    ;
    run;
    En tout cas un grand merci à vous.

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

Discussions similaires

  1. Shell script pour compter le nombre de fichiers par extension
    Par andress33 dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 30/03/2015, 01h26
  2. [OL-2007] Une macro pour compter le nombre de pièces jointes dans outlook 2007
    Par lafifine dans le forum VBA Outlook
    Réponses: 4
    Dernier message: 19/11/2013, 12h17
  3. Pb pour compter le nombre d'enregistrements
    Par 2012Gilles dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/09/2012, 18h36
  4. [XL-2007] MACRO pour compter le nombre des fichiers sur le serveur FTP
    Par kinkichin dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 04/07/2011, 18h09
  5. Compter le nombre d'enregistrements par minute
    Par Kosti dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/06/2008, 15h58

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