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 :

supprimer les doublons après la mise à jour


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    supprimer les doublons après la mise à jour
    bonjour tout le monde, j'ai une problématique à vous poser :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    data test2;
      input id $ region $ departement $ quartier $ commune $;
      cards;
    10 25 NULL NULL NULL
    10 NULL 27 NULL NULL
    10 NULL NULL 13 20
    111 94 NULL NULL NULL
    113 27 NULL NULL NULL
    113 NULL 25 NULL NULL
    113 NULL NULL 30 NULL
    113 70 NULL NULL NULL
    113 NULL NULL NULL 100
    ;
    run;


    je veux supprimer les doublons mais avant de le faire j'aimerais bien mettre à jour les valeurs NULL de même id
    exemple pour id =10 j'aurai la ligne 10 27 13 20

    j'aurais comme résultat ce tableau

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    10 25 27 13 20
    111 94 NULL NULL NULL
    113 70 25 30 100


    je vous remercie d'avance

  2. #2
    Membre éprouvé
    Regrouper des observations
    Bonjour,

    Êtes-vous sûr de ce que vous voulez faire ? Une de vos collègues a posé une question sur le même jeu de données ici.

    Votre demande n'est pas suffisamment précise. Comment choisissez-vous entre la région 27 et la région 70 pour l'id 113 ?

    En supposant que vous vouliez le maximum, vous pouvez utiliser la proc univariate :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    data test2;
      input id region departement quartier commune;
      cards;
    10 25 . . .
    10 . 27 . .
    10 . . 13 20
    111 94 . . .
    113 27 . . .
    113 . 25 . .
    113 . . 30 .
    113 70 . . .
    113 . . . 100
    ;
    run;


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    proc univariate data=test2 noprint;
      var region departement quartier commune;
      by id;
      output out=test2_out max=region departement quartier commune;
    run;


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     id    region    departement    quartier    commune
     10      25           27           13          20
    111      94            .            .           .
    113      70           25           30         100


    Cordialement,

  3. #3
    Membre à l'essai
    j ai pris le même jeux de donné car j ai un problème similaire , la différence que je cherche à cumuler les informations pour chaque ID on remarque bien que à chaque ligne y a des informations qui manquent , le but est de cumuler les informations dans une seule ligne pour chaque ID , et pour les informations disponibles pour un ID on prend la dernière

  4. #4
    Membre éprouvé
    Regrouper des observations
    Bonjour,

    Je ne connais pas de fonction "dernière donnée non manquante" qui pourrait être utilisée dans la proc univariate.

    Une possibilité est de traiter chaque variable indépendamment et merger les tables obtenues :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    data test2;
      input id $ region $ departement $ quartier $ commune $;
      cards;
    10 25 NULL NULL NULL
    10 NULL 27 NULL NULL
    10 NULL NULL 13 20
    111 94 NULL NULL NULL
    113 27 NULL NULL NULL
    113 NULL 25 NULL NULL
    113 NULL NULL 30 NULL
    113 70 NULL NULL NULL
    113 NULL NULL NULL 100
    ;
    run;


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    %macro niveau(niv);
      data ∋
        set test2(keep=(id niv) where=(niv ne "NULL"));
        by id;
        if last.id;
      run;
     
      data test2_out;
        merge test2_out ∋
        by id;
      run;
    %mend;


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data test2_out;
      length id 8.;
    run;
     
    %macro niveau(region);
    %macro niveau(departement);
    %macro niveau(quartier);
    %macro niveau(commune);


    Cordialement,

    PS : J'ai vu que j'avais oublié de coller le code de la proc univariate dans mon précédent message, c'est réparé.

  5. #5
    Membre à l'essai
    problème résolue
    je vous remercie infiniment le code marche très bien et donne le résultat souhaité

    je vous propose une amélioration pour ne pas répéter l’exécution de la macro plusieurs fois en cas on aura plusieurs colonnes :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    proc sql;
            create table inventaire_tables_col as select
            b.name
            from dictionary.columns b
            where  b.libname eq "WORK"
            and    b.memtype ="DATA"
            and    strip(lowcase(b.memname)) eq "test2" 
    		and    strip(lowcase(b.name)) ne "id" ;
        quit;
    data _null_;
    set inventaire_tables_col; 
    call execute('%nrstr(%niveau(%nrstr('||strip(name)||')))');
    run;