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 :

Comptage d'une variable selon plusieurs critères


Sujet :

Macro

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2017
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Comptage d'une variable selon plusieurs critères
    Bonsoir,

    Je cesse désespérément à trouver une solution à mon problème ...
    Je travaille sur SAS sur des consommations de médicaments de tous les jours. J'ai donc dans ma base de données, une ligne par jour de suivi pour les sujets : un sujet a donc 365 lignes s'il a été suivi un an. Chaque jour, je sais s'il a oui non consommé le médicament (variable binaire MED).

    Mon objectif est de calculer la somme des jours de consommation (somme des 1) sur les 91 jours précédents. Donc chaque jour, je regarde combien de fois, le sujet a consommé des médicaments dans les 91 derniers jours.
    J'ai voulu utilisé la fonction LAG qui me semble judicieux, mais il faut l'utiliser dans une macro (car 91 LAG, ca va pas le faire ...).
    Je voudrais utiliser une boucle DO i=1 to 91, et incrémenter la valeur du lag à chaque fois pour obtenir une somme finale ... Sauf que j'y arrive pas du tout ...

    Sauriez-vous comment faire ?

    Un grand merci !!

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut
    bonjour,
    eh non ! La macro ne s'impose pas ici : il suffit de calculer la somme dans une table séparée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    data donnees91;set donnees;if _n_ <=91;run; /* sélection des 91 premières lignes de la table de données */
    proc summary data = donnees91;var med;output out=resultats sum=somme;run;
    (à moins qu'il y ait un truc qui m'aie échappé dans l'exposé du problème ...)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2017
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Bonjour,
    Merci d'y répondre, justement ce n'est pas les 91 premières lignes de la base sur lesquelles je dois faire le calcul, mais c'est vraiment pour chaque ligne, regarder les 91 lignes précédentes. Donc réitérer le calcul à chaque ligne.

    Mes données sont de ce genre :
    Date Medicament
    Jour_1 1
    Jour_2 1
    Jour_3 1
    Jour_4 0
    Jour_5 0
    ...
    Jour_100 1
    ...
    Jour_450 1
    ...

    Vois-tu la nuance ?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut
    Et comme ça alors ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    data t;set t;
    s=lag1(med)+lag2(med)+lag3(med)+lag4(med)+lag5(med)+lag6(med)+lag7(med)+lag8(med)+lag9(med)+lag10(med);     
    s=s+lag11(med)+lag12(med)+lag13(med)+lag14(med)+lag15(med)+lag16(med)+lag17(med)+lag18(med)+lag19(med)+lag20(med);
    s=s+lag21(med)+lag22(med)+lag23(med)+lag24(med)+lag25(med)+lag26(med)+lag27(med)+lag28(med)+lag29(med)+lag30(med);
    s=s+lag31(med)+lag32(med)+lag33(med)+lag34(med)+lag35(med)+lag36(med)+lag37(med)+lag38(med)+lag39(med)+lag40(med);
    s=s+lag41(med)+lag42(med)+lag43(med)+lag44(med)+lag45(med)+lag46(med)+lag47(med)+lag48(med)+lag49(med)+lag50(med);
    s=s+lag51(med)+lag52(med)+lag53(med)+lag54(med)+lag55(med)+lag56(med)+lag57(med)+lag58(med)+lag59(med)+lag60(med);
    s=s+lag61(med)+lag62(med)+lag63(med)+lag64(med)+lag65(med)+lag66(med)+lag67(med)+lag68(med)+lag69(med)+lag70(med);
    s=s+lag71(med)+lag72(med)+lag73(med)+lag74(med)+lag75(med)+lag76(med)+lag77(med)+lag78(med)+lag79(med)+lag80(med);
    s=s+lag81(med)+lag82(med)+lag83(med)+lag84(med)+lag85(med)+lag86(med)+lag87(med)+lag88(med)+lag89(med)+lag90(med)+lag91(med);
    run;

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2017
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Oui c'est possible, c'est ce que j'ai fait et ca marche, et j'ai aussi 91 lignes pour vérifier que les lignes précédentes appartiennent bien au même individu ... Mais c'est clairement pas beau ! Et j'ai surtout 400 000 lignes donc temps de calcul peut être amélioré ahah ...

  6. #6
    Membre éprouvé
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    Janvier 2012
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Points : 1 142
    Points
    1 142
    Par défaut
    Bonjour,

    Avec une proc sql plutot qu'une étape data ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    proc sql;
     
    	create table temp as select distinct patient, date from donnees;
     
    	create table donnees91 as select 
    		t1.patient,
    		t1.date,
    		sum(t2.med) as total_91
    	from temp t1, donnees t2
    	where t1.patient=t2.patient and  0<=t1.date-t2.date<91
    	group by 1,2;
    quit;
    Bon courage

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut
    Voici le code macro que je te propose ("simple" "macrotisation" du programme précédent, en fait) : c'est un peu plus "joli". En termes de temps calcul, je ne sais pas si c'est plus rapide ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    %macro calcul;
    data t;set t;
    	s= lag1(med);
    	%do i= 2 %to 91; s=s+lag&i (med);%end;
    run;
    %mend;

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/08/2017, 17h08
  2. Réponses: 5
    Dernier message: 14/10/2016, 10h08
  3. Recherche d'une date selon plusieurs critères
    Par laurentSc dans le forum Langage
    Réponses: 4
    Dernier message: 04/10/2015, 12h31
  4. Remplir une listebox selon plusieurs critères de recherche
    Par kiki89 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 18/03/2014, 15h36
  5. Réponses: 2
    Dernier message: 17/02/2014, 09h23

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