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 :

Deux tables sas avec une même variable qui a des observations (=valeurs) différentes


Sujet :

SAS Base

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Deux tables sas avec une même variable qui a des observations (=valeurs) différentes
    Bonjour,
    J'ai deux tables ( A et B) sas ayant les mêmes variables sauf que dans B j'ai 800 observations et que dans A j'en ai 400.
    Je voudrai enlever les 400 observations de B qui diffère de A pour obtenir une table B avec les même 400 observations que celle de A.

    Je sais pas si j'ai été clair.

  2. #2
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    Bonsoir,

    Peux tu préciser un peu ton problème ? En mettant des exemples de tables que tu as à ta disposition et le résultat souhaité ? La je ne vois pas bien ton problème car pour moi si tu veux enlever les observations qui diffèrent de A dans la table B alors tu retombera sur ta table A non ? Bref j'ai pas bien compris :p

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 2
    Points
    2
    Par défaut la forme de mes tables
    ma première table ressemble à ça (avec 400 lignes):

    date_production serie M199901 M199902 ....

    201401 M_FR_123 44
    201401 M_FR_124 156
    201401 M_FR_125 23
    .... ... ..
    201401 M_FR_300 56

    ma deuxième table ressemble à ça (avec 800 lignes):

    date_production serie M199901 M199902 ....

    201501 M_FR_126 28
    201501 M_FR_123 40
    201501 M_FR_300 13
    .... ... ..
    201501 M_FR_123 789
    201501 M_FR_200 140
    201501 M_FR_222 150

    Je veux que ma deuxième table garde les mêmes séries que la première table (je veux enlever les séries qui diffèrent de la table1). J'ai dans ma deuxième table des nouvelles séries qui ont été créé et je veux les enlever (les nouvelles séries ne sont pas à la fin de ma table, je peux pas enlever les 400 dernières lignes de ma deuxième table).

  4. #4
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 2
    Points
    2
    Par défaut re
    J'ai fait un exemple avec 4 variables :
    date_production , serie, M199901, M19902 (je n'ai pas remplie de valeur ds cette colonne)

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    Bonjour boix66,

    Est ce que ce code donne ce que tu recherches ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    proc sql;
    	create table B2 as
    	select DATE_PRODUCTION, SERIE, M199901, M199902
    	from A 
    	where SERIE not in (select SERIE from B);
    quit;

  6. #6
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    ma table B2 est vide.

    Je suis partie sur autre chose. J'ai pu identifier les séries indésirables, et je les ai mis dans ma macro variable liste (de type chaine de caractère)
    mais en effectuant la data ça ne marche pas et je comprends pas où est mon erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    proc sql noprint;
    select _name_ into: liste
    separated by ' '  from t3;
    quit;
     
    %put &liste;
     
    data toto;
    set T_201501_test;
    if _name_ in (&liste) then delete;
    run;

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    Quelle est l'erreur ?

    Je pense qu'il faudrait que les valeurs de la macro variables &liste soient entre quotes tel que : %put &liste; "valeur1" "valeur2" "valeur3"

  8. #8
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    Bonjour,

    Essaye 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
     
     
    data A;
    input date_production serie :$10. M199901;
    cards;
    201401 M_FR_123 44
    201401 M_FR_124 156
    201401 M_FR_125 23
    201401 M_FR_300 56
    ;run
    ;
    data b;
    input date_production serie :$10. M199901 ;
    cards;
    201501 M_FR_126 28
    201501 M_FR_123 40
    201501 M_FR_300 13
    201501 M_FR_123 789
    201501 M_FR_200 140
    201501 M_FR_222 150
    ;run;
     
    data B2 (drop=rc);
    if _n_ = 1 then do;
    	        declare hash h(dataset: "a");
                h.defineKey("serie");
                h.defineDone();
    end;
     
    set b;
    rc = h.find();
    if rc = 0 ;
    run;

    Citation Envoyé par boix66 Voir le message
    ma table B2 est vide.

    je comprends pas où est mon erreur.
    Pour ce qui est de ton code il faut que ta liste de modalité dans le "in" soit séparée par des virgules et comme tes modalités sont caractères il faut des quotes, ceci devrait régler le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    proc sql noprint;
    select quote(_name_) into: liste
    separated by ','  from t3;
    quit;
     
    %put &liste;
     
    data toto;
    set T_201501_test;
    if _name_ in (&liste) then delete;
    run;
    A+

  9. #9
    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,
    Justement, il faudrait mettre la variable _name_ entre quotes avant de les stocker dans la macro variable liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    proc sql noprint;
        select quote(strip(_name_)) into: liste 
        separated by ' ' from t3;
        quit;	   %put id= &liste ;
     
    data toto;
        set T_201501_test;
        if _name_ in (&liste) then output ;
        run;
    Je pense que la proposition d'Aleksik est correcte (mettre in à la place de not in) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    proc sql;
    create table B2 as
    select * from T_201501_test
    where _name_ in  (select _name_ from T3);
    quit;

  10. #10
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Merci
    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
    proc sql noprint;
    select _name_ into: liste
    separated by ' '  from t3;
    quit;
     
    %put &liste;
     
    %LET value_list=  ;  
    /* j'enlève les nvlles séries de 2015 pr chaque table de 2015 */
    %macro test(num);
     
    %LET i=1;
     
    %DO %WHILE(%LENGTH(%SCAN(&liste,&i))); 
     
    %LET current_value=%SCAN(&liste,&i);
     
    %PUT &current_value ;
    data T_2015&num.;
    set T_2015&num.;
    if _name_ in ("&current_value") then delete;
    run;
    %LET i=%EVAl(&i+1); 
     
    %END;
     
    %MEND test;
    J'ai fait comme ça et ça a l'air de marcher. Mais c'est un peu plus long que vous. Je pense que jvais reprendre ce que vs avez fait. Encore merci !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Eclater une table SAS avec une macro
    Par amarol dans le forum Macro
    Réponses: 3
    Dernier message: 15/07/2013, 13h43
  2. Réponses: 3
    Dernier message: 30/05/2012, 09h24
  3. Réponses: 1
    Dernier message: 01/09/2009, 12h27
  4. Réponses: 2
    Dernier message: 22/10/2008, 11h51
  5. [vector] Partager une même variable entre deux objets.
    Par Ekinoks dans le forum SL & STL
    Réponses: 18
    Dernier message: 25/08/2005, 20h40

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