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

SAS Base Discussion :

Loop SAS sur dataset


Sujet :

SAS Base

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Loop SAS sur dataset
    Bonjour,

    J'ai besoin d'une aide pour faire une boucle en code SAS.

    Ma table de base ressemble à :

    VAL1;VAL2
    10;60
    -100;60
    50;100
    -30;70

    La boucle commence si la somme de val1 est < 0 , dans mon cas elle est de -70.

    La boucle doit prendre -70 de val2 et les affecter à val1 comme suit :
    ****************************
    sum = -70;
    do until (while ??) sum = 0;

    prendre le maximum de val2 et l'ajouter à val1 , si cette somme ajoutée n'est pas assez , on passe à la ligne suivante ....et ainsi de suite


    dans mon cas , de la première ligne on doit ajouter 60 à val1 , il reste 10 qu'on prend de la deuxième ligne ..Et la boucle est fini.
    **************************************

    J'espère être clair dans mes explications .

    d'avance merci pour votre aide.

    othmane.

  2. #2
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Je te propose cette solution:
    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
    83
    84
    85
    86
    87
     
     
    data test1;
    input id var1 var2;
    cards;
    1 10 60
    1 -100 60
    1 50 100
    1 -30 70
    2 10 60
    2 -70 60
    2 50 100
    2 -30 70
    2 10 60
    2 -70 60
    2 50 100
    2 -30 70
    3 10 60
    3 -70 60
    3 50 100
    4 10 60
    4 70 60
    4 50 100
    ;run;
     
    %macro cal(table);
    data test2;
    retain temp 0 pos 0;
    do until(last.id);
    set &table ;
    temp=temp+var1;
    if first.id then pos=0;
    pos+1;
    by id;
    if last.id then do;
    temp1=temp;
    call symputx('temp1'||left(_n_),compress(temp));
    call symput ('nbr',compress(_n_));
    call symput ('id'||left(_n_),compress(id));
    end;
    output;
    end;
    run;
     
    data test3;
    %do i=1 %to &nbr;
    temp2=&&temp1&i;
    id=&&id&i;
    output;
    %end;
    run;
     
    data test4;
    merge test2 test3;
    by id;
    run;
    %mend;
     
    %cal(test1);
     
     
    %macro tt(pos=,id=);
    data test5 (keep=id var1 var2 );
    set test4;
    if temp2<0 and pos=&pos and id=&id and abs(temp2)>var2 then do;
    var1=var1+var2;
    var2=0;
    end;
    if temp2<0 and pos=&pos and id=&id and abs(temp2)<var2 then do;
    var1=var1-temp2;
    var2=var2+temp2;
    end;
    if temp=0 then do;
    var1=var1 ;
    var2=var2;
    end;
    run;
     
    %cal(test5);
     
    %mend;
     
     
    data _null_;
    set test4;
    call execute('%nrstr(%tt(pos='||strip(pos)||',id='||strip(id)||'));');
    run;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  3. #3
    Membre éprouvé
    Avatar de Haache
    Homme Profil pro
    Doctorant & Ingénieur Statiaticien Economiste
    Inscrit en
    Mars 2014
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant & Ingénieur Statiaticien Economiste

    Informations forums :
    Inscription : Mars 2014
    Messages : 349
    Points : 1 009
    Points
    1 009
    Billets dans le blog
    8
    Par défaut
    Bonjour

    Je propose ceci

    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
    data test;input var1 var2;
    cards;
    10 60
    -100 60
    50 100
    -30 70
    10 60
    -70 60
    50 100
    -30 70
    10 60
    -70 60
    50 100
    -30 70
    10 60
    -70 60
    50 100
    10 60
    70 60
    25 100
    ;run;
     
    %macro test;
    proc sql noprint;
    select sum(Var1) into : Sum from test;
    %if  &sum le 0 %then %do;
    proc iml;
    use test;
    read all var {Var1 Var2} into X;
    Y=X||j(nrow(X),2,0);
    Y[1,3]=%sysevalf(-1*&sum);
    Y[1,4]=Y[1,3]-Y[1,2];
    do i=2 to nrow(Y);
    Y[i,3]=Y[i-1,4]; Y[i,4]=Y[i,3]-Y[i,2];
    end;
    CREATE Test1 FROM Y[colname={"Var1","Var2","Test1","Test2"}] ;
    APPEND FROM Y;
    CLOSE test1;
    quit;
    %end;
    data test1 (drop = test1 test2);
    set test1;
    if test1>0 then do;
    if test2>=0 then do;
    Var1=Var1+Var2; Var2=0;
    end;
    else do;
    Var1=Var1+test1; 
    Var2=Var2-test1;
    end;
    end;
    run;
    %mend;
     
     
    %test;
    • Faites un tour sur mon siteweb professionnel www.aristideelysee.16mb.com Des codes dans la section "media et code" pouvant vous aider que vous pouvez aussi partager sur les réseaux sociaux.
    • Visiter mon blog en cliquant ici! Des techniques, astuces et macros pour l'analyse quantitative.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    Voici une troisième proposition sans MACRO :
    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
    data test;
    input var1 var2;
    cards;
    10 60
    -100 60
    50 100
    -30 70
    10 60
    -70 60
    50 100
    -30 70
    10 60
    -70 60
    50 100
    -30 70
    10 60
    ; run ;	 
     
    proc transpose DATA=test out=test_out ( where=(_name_='var1') ) ;
    run ;	  
     
    data Finale (drop=col:);  
    set test ; 
    if _n_=1 then set test_out (drop=_name_);  
    somme=sum(of col:) ;
    if      somme < 0 then do ;
    if var2+somme < 0 then do ; var1=var1+var2  ; col1=col1+var2 ;  end ;
    else                   do ; var1=var1-somme ; col1=col1-somme ; end ;
    		      end ; 
    run ;
    Ward

  5. #5
    Membre éprouvé
    Avatar de Haache
    Homme Profil pro
    Doctorant & Ingénieur Statiaticien Economiste
    Inscrit en
    Mars 2014
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant & Ingénieur Statiaticien Economiste

    Informations forums :
    Inscription : Mars 2014
    Messages : 349
    Points : 1 009
    Points
    1 009
    Billets dans le blog
    8
    Par défaut
    Hossward
    Tu es simplement un génie.
    • Faites un tour sur mon siteweb professionnel www.aristideelysee.16mb.com Des codes dans la section "media et code" pouvant vous aider que vous pouvez aussi partager sur les réseaux sociaux.
    • Visiter mon blog en cliquant ici! Des techniques, astuces et macros pour l'analyse quantitative.

Discussions similaires

  1. Requete sur DataSet
    Par alaa_85 dans le forum VB.NET
    Réponses: 2
    Dernier message: 03/07/2007, 18h36
  2. Réponses: 6
    Dernier message: 10/04/2007, 23h50
  3. [C#][Débutant] Question sur Dataset
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/05/2006, 19h59
  4. [VB.NET][CR] Etat vide sur Dataset
    Par axel_info dans le forum SDK
    Réponses: 1
    Dernier message: 26/03/2006, 10h25
  5. [C#] Requete sur Dataset
    Par Fredo02 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/01/2006, 08h02

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