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

SAS Base Discussion :

Calcul d'une formule sur SAS


Sujet :

SAS Base

  1. #1
    Nouveau membre du Club
    Calcul d'une formule sur SAS
    Bonjour cher réseau.
    Je vous présente la structure de mon tableau:
    j'ai 106 variables qui sont: ID NNI CBRD Bdate Lact velage Milk5 Milk6 Milk7 ................Milk305
    mes individus sont des vaches, chaque vache est représentée dans une ligne.


    [TH]ID[/TH]
    [TH]NNI[/TH]
    [TH]CBRD[/TH]
    [TH]Bdate[/TH]
    [TH]Lact[/TH]
    [TH]velage[/TH]
    [TH]Milk5[/TH]
    [TH]Milk6[/TH]
    [TH]Milk7[/TH]
    [TH]................[/TH]
    [TH]Milk305[/TH]
    3305 MA3305 MO 12/06/2011 2 12/08/2016 21 15 16 ................ 22
    3306 MA3306 MO 12/06/2011 2 12/08/2016 23 16 19 ................ 20
    3307 MA3307 MO 12/06/2011 2 12/08/2016 21 25 19 ................ 29
    3308 MA3308 HO 10/05/2010 6 02/03/2019 11 16 16 ................ 21
    3309 MA3309 HO 10/05/2010 6 02/03/2019 11 15 16 ................ 18
    3310 MA3310 HO 10/05/2010 6 02/03/2019 21 25 26 ................ 19

    les variables Milkj présentent la production en lait le jour j

    Je voudrais calculer pour chaque vache la somme de la production maximale ( Milk la plus élevée) et des productions (Milk) pendant 5 jours avant et après ce max.
    en d'autre termes je dois chercher le max parmi Milk5 jusqu'au Milk305, le situer et l'additionner avec les valeurs de 5 milk avant et 5 milk après.
    J'espère que j'ai bien expliqué mon problème sachant que j'ai réussi à le résoudre avec Excel via cette formule.
    Code formule :Sélectionner tout -Visualiser dans une fenêtre à part
    =SOMME(DECALER($A$1;;EQUIV(MAX($A$1:$KT$1);$A$1:$KT$1;0)-5-1;;11))

    Merci d'avance pour vos réponses.
    Cordialement.

  2. #2
    Invité
    Invité(e)
    Bonjour,

    Je propose d'utiliser un array avec la fonction whichn pour retrouver l'index du maximum
    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
    data x;
    	/* valeurs pour exemple */
    	milk1=1;milk2=50;milk3=0;milk4=12;milk5=10;milk6=10;milk7=10;milk8=50;milk9=2;
     
    	array ar_milk [*] milk:;
     
    	maxi = max(of ar_milk[*]);
    	index_maxi = whichn(maxi, of ar_milk[*]);
     
    	/* somme des 5 avants, maxi et 5 après
    	On vérifie que l'index n'est pas en dehors des bornes */
    	calculs = 0;
    	do i = -5 to 5;
    		if 1 <= index_maxi+i <= dim(ar_milk) then calculs = sum(calculs,ar_milk[index_maxi+i]);
    	end;
    	drop i;
    	drop maxi;
    	drop index_maxi;
    run;


    2 questions restent cependant en suspend :
    • Que fait-t-on quand il y a moins de 5 jours avant/après le maximum ?
    • Quel jour choisir si plusieurs valent le maximum ?

  3. #3
    Nouveau membre du Club
    Bonjour merci infiniment pour votre réponse.
    Pour votre première question, en terme de lactation ,cela n'arrive pas (question de nature) d'ailleur le pic se situe invariablement entre 50 et +/-65 jours.
    Pour votre deuxième question, on prend en compte la première valeur max.
    Pour l'instruction array désolée mais je suis débutante et j'ai pas compris qu'est ce que je dois mettre dans /*les valeurs pour exemple*/, est ce que je dois écrire ces instruction pour chaque vache(ligne) et saisir les valeurs de milk1 jusqu'au milk305?

    Cordialement

  4. #4
    Invité
    Invité(e)
    Parfait pour les 2 questions, la réponse proposée convient donc

    Pour la ligne "les valeurs pour exemple", vous pouvez l'enlever. C'était pour tester si cela fonctionnait bien.
    L'importante commence à partir de l'instruction array : on crée un tableau (array), du nom de ar_milk, de dimension non précisée ([*]), et contenant toutes les variables dont le nom commence par milk (milk:).

  5. #5
    Nouveau membre du Club
    Citation Envoyé par Muse de Thamir Voir le message
    Parfait pour les 2 questions, la réponse proposée convient donc

    Pour la ligne "les valeurs pour exemple", vous pouvez l'enlever. C'était pour tester si cela fonctionnait bien.
    L'importante commence à partir de l'instruction array : on crée un tableau (array), du nom de ar_milk, de dimension non précisée ([*]), et contenant toutes les variables dont le nom commence par milk (milk:).
    Ce code marche parfaitement bien, je vous suis reconnaissante.
    Merci beaucoup:

###raw>template_hook.ano_emploi###