1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2017
    Messages : 7
    Points : 1
    Points
    1

    Par défaut Comment dupliquer des lignes sous conditions

    Bonjour,

    J'ai une table ou la clef c'est le NumEtudiant.
    C'est une table de 5 colonnes en tout.

    Avec un exemple c'est plus facile à comprendre:

    J'ai cette table
    NumEtudiant DateDebut Note Coefficent Groupe
    001254 201703 17 2 S
    001254 201707 16 1 I
    001478 201706 15 2 I
    001478 201707 14 3 I

    Je souhaite pour chaque NumEtudiant si l'info n'existe pas pour un mois, reprendre la ligne du mois précédent la dupliquer, de sorte à ce que à la fin j'ai pour chaque NumEtudiant

    Je souhaite avoir ca à la fin, cette table:

    NumEtudiant DateDebut Note Coefficent Groupe
    001254 201703 17 2 S
    001254 201704 17 2 S
    001254 201705 17 2 S
    001254 201706 17 2 S
    001254 201707 16 1 I
    001478 201706 15 2 I
    001478 201707 14 3 I

    Pour le NumEtudiant 001254, on avait pas de ligne pour les mois de 201704, 201705 et 201706 : on duplique la ligne de 201703 pour ces 3 mois.

    Si vous pouvez m'aider ca m'aidrait à terminer mon stage

    Merci d'avance,

    Meryem

  2. #2
    Membre confirmé
    Inscrit en
    novembre 2009
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 266
    Points : 546
    Points
    546

    Par défaut Comment dupliquer des lignes sous conditions

    Bonjour,

    Vous pouvez regarder ce message.

    Cordialement,

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2017
    Messages : 7
    Points : 1
    Points
    1

    Par défaut

    Merci pour cette réponse rapide.

    Mais j'ai 2 colonnes clefs : NumEtudiant et DateDebut.

    Dans ce message il y en a une seul : x.

    et mes dates DateDebut, ca va pas de 1 en 1 (de 201704 à 201705 effectivement on a un pas de 1, mais de 201612 à 201701 par exemple non).

    Donc c'est un peu plus compliqué mais j'essaye de l'adapter.

    Et les NumEtudiant c'est pas des 1, 2, 3... mais 07089932, 00541434...

  4. #4
    Membre expert
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    avril 2008
    Messages
    1 788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : avril 2008
    Messages : 1 788
    Points : 3 951
    Points
    3 951

    Par défaut

    Bonjour.
    Une solution possible :
    1. créer une table avec une ligne par étudiant, et trois colonnes (identifiant, mois le plus ancien, mois le plus récent), en SQL par exemple, ou avec une proc MEANS
    2. avec une étape Data, générer tous les mois dans cet intervalle pour chaque étudiant, avec une boucle DO et une instruction OUTPUT ==> on obtient un "squelette" complet
    3. fusionner avec les vraies données
    4. parcourir le résultat de la jointure en reprenant les valeurs de l'observation précédente si elles sont manquantes (= pour les mois absents des données), avec une fonction LAG (attention à ne jamais utiliser LAG après un IF ou un ELSE)

    Deux remarques : 1) ça sera plus simple si tu crées les mois en dates SAS, une fonction avec INTNX permettant d'ajouter aisément des mois ; 2) on peut probablement tout faire en une seule étape mais le code risque d'être assez moche, long et peu maintenable. L'algorithme ci-dessus offre au moins la possibilité de contrôler les résultats intermédiaires.
    Bon courage.
    Olivier

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2017
    Messages : 7
    Points : 1
    Points
    1

    Par défaut

    Merci Olivier pour ta proposition mais peu compliqué pour moi j'avoue je ne suis pas experte en SAS.

    je ne vais travailler que sur 2017 pour faire plus simple (la periode 201701-201707 est celle qui m'intérèsse le plus).

    et là j'ai des pas de 1 en 1 pour DateDebut, d'un mois à l'autre (entre 201701 et 201707).

    et ca me rapproche de la discussion que mgdondon m'a demandé de regarder : avec 2 différences maintenant ( 1) les NumEtudiant ne sont pas des pas de 1 en 1, le plus simple serait d'attribuer un chiffre à chaque étudiant (j'ai 20874 etudiants donc 20874 NumEtudiant différents et 2) ensuite faire une double boucle )

    Parce que là pour mes 2 variables clefs NumEtudiant et DateDebut, j'aurai des pas de 1 en 1.

    Meryem

  6. #6
    Membre expert
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    avril 2008
    Messages
    1 788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : avril 2008
    Messages : 1 788
    Points : 3 951
    Points
    3 951

    Par défaut

    Bonjour Meryem.
    Dans la solution de mgdondon, il faut bien garder à l'esprit que tu n'as pas forcément besoin d'écrire 2 boucles, puisque SET est déjà une boucle (qui itère sur les observations d'une table).
    Cela dit, le code qui correspond me semble un peu galère à écrire, puisqu'à chaque observation il faudra vérifier que le mois courant est bien la suite immédiate du mois à l'observation précédente (avec un LAG par exemple), et si ce n'est pas le cas, lancer une boucle pour boucher les trous. Pourquoi pas, le code fera une dizaine de lignes mais ne sera pas forcément simple à comprendre.
    As-tu essayé l'enchaînement que je proposais ? Si oui, à quelle étape butes-tu ? Si tu ne proposes pas de code, on a l'impression de devoir bosser à ta place...
    Bon courage.
    Olivier

  7. #7
    Membre confirmé
    Inscrit en
    novembre 2009
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 266
    Points : 546
    Points
    546

    Par défaut Comment dupliquer des lignes sous conditions

    Bonjour,

    Les deux propositions reposent sur le même principe : la première étape consiste à créer les lignes manquantes et la deuxième à remplacer les données manquantes par les valeurs précédentes.

    Olivier décompose l'étape 1 pour vos données (points 1, 2, 3). Le point 4 correspond à l'étape 2 en utilisant l'instruction lag plutôt qu'un double set.

    Cordialement,

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2017
    Messages : 7
    Points : 1
    Points
    1

    Par défaut

    data table1;
    set TableEtudiants(where=((input(substr(DATDEB, 1, 6), 6.)) >= 201701));
    NumEtudiant1=input(substr(NumEtudiant, 1, 6), 6.);
    DATDEB1 = input(substr(DATDEB, 1, 6), 6.);
    run;

    proc sort data=table1;
    by NumEtudiant1 DATDEB1 ;
    run;

    data table2;
    do NumEtudiant1 = 00000033 to 90908761 ;
    do DATDEB1=201701 to 201707;
    output;
    end;
    output;
    end;
    run;

    data table;
    merge table1 table2;
    by NumEtudiant1 DATDEB1;
    run;


    data table3;
    set table;
    n=_n_;
    if missing(Note ) then do;
    do until (not missing(Note ));
    n=n-1;
    set table(keep=Note Coefficent Groupe) point=n;
    end;
    end;
    run;

  9. #9
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2017
    Messages : 7
    Points : 1
    Points
    1

    Par défaut

    Voilà mon code car je n'arrive pas à utiliser la méthode d'Olivier, trop compliqué pour moi de la faire seule.

    Mais le pb je pense que c'est que NumEtudiant1 ne va pas de 1 à N (N= nb d'étudiants) : avec des pas de 1 en 1.

    J'essaye d'abord de trouver comment créer une autre colonne NumEtudiant2 ou j'ai 1, 2,.....N : après sûrement la double boucle marchera bien.

    Merci encore pour votre aide

  10. #10
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2017
    Messages : 7
    Points : 1
    Points
    1

    Par défaut

    Pour répondre à votre question Olivier sur votre méthode : j'avais réussi à faire que la 1ère étape et avec une autre méthode (je n'ai pas réussi avec la solution proposé)

    Voila l'étape 1 avec ma méthode:

    data table_OLDEST_DATEDEB1(rename=(DATDEB1=OLDEST_DATEDEB1));
    set TableEtudiants;
    NumEtudiant1=input(substr(NumEtudiant, 1, 6), 6.);
    DATDEB1 = input(substr(DATDEB, 1, 6), 6.);
    run;
    proc sort data=table_OLDEST_DATEDEB1(keep=NumEtudiant1 OLDEST_DATEDEB1) ;
    by NumEtudiant1 OLDEST_DATEDEB1;
    run;
    proc sort data=table_OLDEST_DATEDEB1 nodupkey;
    by NumEtudiant1 ;
    run;

    data table_YOUNGEST_DATEDEB1(rename=(DATDEB1=YOUNGEST_DATEDEB1));
    set TableEtudiants;
    NumEtudiant1 =input(substr(NumEtudiant, 1, 6), 6.);
    DATDEB1 = input(substr(DATDEB, 1, 6), 6.);
    run;

    proc sort data=table_YOUNGEST_DATEDEB1(keep=NumEtudiant1 YOUNGEST_DATEDEB1);
    by NumEtudiant1 descending YOUNGEST_DATEDEB1;
    run;
    proc sort data=table_YOUNGEST_DATEDEB1 nodupkey;
    by NumEtudiant1 ;
    run;

    data table;
    merge table_OLDEST_DATEDEB1 YOUNGEST_DATEDEB1;
    by NumEtudiant1 ;
    run;

  11. #11
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2017
    Messages : 7
    Points : 1
    Points
    1

    Par défaut

    L'étape : avec une étape Data, générer tous les mois dans cet intervalle pour chaque étudiant, avec une boucle DO et une instruction OUTPUT.

    Pour cette étape je ne vois pas comment faire? surtout que une boucle do, ca marche si on a des pas de en 1.
    donc e 201701 à 201702 : ok ca marche
    Mais
    après 201612 si je fais un pas de 1 on a 201613 (alors que après 201612 décembre 2016, on a 201701 janvier 2017).

  12. #12
    Membre confirmé
    Inscrit en
    novembre 2009
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 266
    Points : 546
    Points
    546

    Par défaut Comment dupliquer des lignes sous conditions

    Bonjour,

    Il faut aussi prendre en compte la remarque associée :

    Citation Envoyé par olivier.decourt Voir le message
    1) ça sera plus simple si tu crées les mois en dates SAS, une fonction avec INTNX permettant d'ajouter aisément des mois ;
    Cordialement,

    PS : Pensez à utiliser les balises [CODE] autour de votre code, ça facilite la lecture.
    Nom : Sans titre.jpg
Affichages : 18
Taille : 3,9 Ko

Discussions similaires

  1. Dupliquer des lignes sous conditions
    Par bomimi dans le forum Excel
    Réponses: 3
    Dernier message: 14/07/2015, 10h46
  2. [XL-2003] déplacement des lignes sous conditions
    Par tazko dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/03/2011, 19h57
  3. Masquer des lignes sous condition
    Par linousxm dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/05/2010, 13h19
  4. copier des lignes sous conditions (dans 2 colonnes différentes)
    Par olive08 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 12/10/2007, 14h44
  5. Suppression des lignes sous condition multiple
    Par baptbapt dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/06/2007, 16h23

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