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 :

Concaténation de table de sortie SAS


Sujet :

SAS Base

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut Concaténation de table de sortie SAS
    Bonjour, est ce quelqu'un peut m'aider ?
    j'ai plusieurs fichiers contenant plusieursvariables, j'ai du faire une macro fonction de tel sorte a l'appliquer sur chaque fichier, cette boucle contient une procedure freq qui me fait sortir des tables sas pour chaque variable de mon fichier, les sortie table sas freq contiennent les variables de longueur differente, certains ont 2 voir 3 voir 4 modallités, j'aurais souhaiter concatener ces tables en largeur !! help
    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
    88
    89
    %macro test5(fichier);
     
    data donnesN;
    set &fichier;
    keep _NUMERIC_;
    run;
     
    data cara;
    set &fichier;
    keep _CHARACTER_;
    run;
     
    data cara;
    set cara;
    if data=cara then do;
    proc contents data=cara out=Descar;
    run;
    end;
     
         else do;
             proc means data= donnesN  n nmiss min Q1 median Q3 max mean std ; 
             var _ALL_;
             output out= work.quanti; 
             run;
    		 end;
     
     
     
    %let i= _N_;
    data Descar;
    set  Descar;
    call symput(compress("nomvar"||_N_),NAME);
    varId=symget("nomvar"||left(put(_N_,4.)));
    /*call symput(compress("var"||_N_),varnum);
    vaId=symget("var"||left(put(_N_,4.)));
    run;/*;
     
     
    /*%global num;
    data _NULL_; 
    if 0 then set Descar nobs=NAME;
    call symput("num",left(put(NAME)));
    stop;
    run;/*;
     
    /*%let nomb=_N_;*/;
    /*data Des;
    set Descar;
    call symput(compress("var"||_N_,varnum);
    vaId=symget("var"||left(put(_N_,4.)));
    run;*/
    run;
    data Des;
    set  Descar;
    call symput(compress("nomvarr"||_N_),VARNUM);
    varId=symget("nomvarr"||left(put(_N_,4.)));
    run;
     
    %local num;
     
    data Des;
    if 0 then set Des nobs=VARNUM;
    call symput('num',left(put(VARNUM,8.)));
    stop;
    run;
     
     
    data cara;
    set  cara;
     
    /*data _null_;
    if 0 then set cara nobs=count;
    call symput('num',left(put(count,8.)));
    stop;
    run;*/;
     
     
    %do i=1 %to # 
     
        proc freq data=cara order=freq;
        tables &&nomvar&i/out=table&i;
    data tabl&i;
    set  table&i;
    if _N_ le 10;
    drop table&i;
    	%end;
    run;
    %mend;
    %test5(exatraitPS);

  2. #2
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Bonjour,
    Dans le programme ci-dessous je crée deux tables avec des formats différentes. Je crée une table résultats (vide) avec des formats MAX.
    La macro me permet d'empiler ces tables.
    J' espère que ce programme résoudra ton problème.
    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
     
    data toto1;
    format var1 $2. var2 $2.;
    input var1 var2;
    cards;
    a1 b1
    a2 b5
    a2 b2
    a3 b1
    a3 b3
    a3 b4
    ;
    run;
    data toto2;
    format var1 $4. var2 $3.;
    input var1 var2;
    cards;
    a1 b1
    a2 b5
    a2 b2
    a3 b1
    a3 b3
    a3 b4
    ;
    run;
    proc sql; 
    create table toto0 (var1 char(5), var2 char(5));
    quit;
    %macro empiler(nb_tb);
    data res; set 
    %do i=0 %to &nb_tb;
    	toto&i
    %end;;
    run;
    %mend;
    %empiler(2);

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    merci BAHRAOUI,
    j'essayerai demain, j'espere que ça va marcher
    merci beaucoup

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    moi ce que j'ai c'est

    table 1
    "admission hopital" "frequence" "effectifs"
    deces 30 40
    mydriase 15 50

    table2
    "reanimation" "frequence" "effectifs
    debut 10 40
    milieu 27 59
    fin 30 10
    deces 29 20

    j'ai dix tables elles ont toutes un nombre de modalités different, toi le programme que tu propose, je suppose qu'il empile les de haut en bas; or moi ce que je veux c'est qu'il mette les tables en largeur, car le nombre de modalités n'est pas le même pour cahque table et donc pour chaque variable
    merci

  5. #5
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Bonsoir,

    ça risque d'être un plus peu plus compliqué:
    Il faut renommer les colonnes et faire un merge au lieu du set.

    Cordialement.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    donc t'as compri ce que je voulais

    Admission hopital deces mydriase Reanimation debut milieu fin deces
    frequence
    effectifs

    et voila est ce que tu penses que c'est possible c'est une concatenation de chaine de caractère ?
    merci

  7. #7
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    il ya une transposition avant de fusionner les tables.

    Est ce que c'est possible de donner une exemple avec deux tables. Avec les différentes transformations que tu veux? Cela nous permettra de te donner très vite une solution.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    franchement c'est gentil a vous je débute en sas, et il faut bien trouver des solutions, mais cela me depasse:

    c'est exactement ce que je vous ai donné ci-dessus : si vous voulez les tables reelles je ne pourais les apporter que demain, j'installerai sas chez moi des demain

    table 1

    Var(COMAS) frequence effectifs
    mod debut 15 15
    fin 20 20
    hopital 30 30

    VAR =variable MOD=modalité

    table 2

    Var(ADMISSION HOPITAL) freq effectifs
    MOD ambroise paré 30 20
    salpetrire 40 30

    j'ai trente vraible par fichier et donc pour chaque variable j'ai une proc freq,
    je veux reunir toutes les variables entre elles de tel sorte a avoir

    COMA debut fin hopital ADMISSION HOPITAL ambroise paré salpetriere
    frequ 1 5 20 30
    effectif
    si cela ne suffit pas j'essayerai de joindre les tables si j'arrive car il s'agit de tables sas et donc je ne crois pas pouvoir les mettre en piece jointe

    merci encore pour vos efforts
    cordialement,
    Ameur

  9. #9
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Une partie du code pour transposer les tables.
    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
     
    DATA toto1;
    format cle $10. frequence 5. effectif 5.;
    input cle $ frequence effectif;
    cards;
    rean 10 30
    toto 40 50
    titi 100 300
    tata 50 63
    ;
     
     
    DATA toto2;
    format cle $10. frequence 5. effectif 5.;
    input cle $ frequence effectif;
    cards;
    rean 10 30
    tutu 80 10
    titi 1 50
    tata 90 543
    ;
    run;
     
    %macro transposer_var(nb_tb);
    %do i=1 %to &nb_tb;
    	proc sort data=toto&i.; by cle;run;
    	proc transpose data=toto&i. out=toto&i._tr;
    	by cle;
    	run;
    	proc sort data=toto&i._tr; by _name_;run;
    	proc transpose data=toto&i._tr out=toto&i._tr;
    	id cle;
    	by _NAME_;
    	run;
    %end;
    %mend;
    %transposer_var(2);

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    merci pour ton soutien je ne te reponds que maintenant car j'ai pas le net,
    j'ai essayé ton code dans ma boucle, mais le probleme c'est que il me genere les tableaux sans le nom de variable(il met nom de l'ancienne variable), la transposition se fait bien ? toi j'ai vu que ta variable etait la mêmepour les deux tables ID hors moi c'est pas le cas ? comment faire
    merci encore pour ton soutien

    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    %macro test5(fichier,nb_tb);
     
    data donnesN;
    set &fichier;
    keep _NUMERIC_;
    run;
     
    data cara;
    set &fichier;
    keep _CHARACTER_;
    run;
     
    data cara;
    set cara;
    if data=cara then do;
    proc contents data=cara out=Descar;
    run;
    end;
     
         else do;
             proc means data= donnesN  n nmiss min Q1 median Q3 max mean std ; 
             var _ALL_;
             output out= work.quanti; 
             run;
    		 end;
     
     
     
    %let i= _N_;
    data Descar;
    set  Descar;
    call symput(compress("nomvar"||_N_),NAME);
    varId=symget("nomvar"||left(put(_N_,4.)));
    /*call symput(compress("var"||_N_),varnum);
    vaId=symget("var"||left(put(_N_,4.)));
    run;/*;
     
     
    /*%global num;
    data _NULL_; 
    if 0 then set Descar nobs=NAME;
    call symput("num",left(put(NAME)));
    stop;
    run;/*;
     
    /*%let nomb=_N_;*/;
    /*data Des;
    set Descar;
    call symput(compress("var"||_N_,varnum);
    vaId=symget("var"||left(put(_N_,4.)));
    run;*/
    run;
    data Des;
    set  Descar;
    call symput(compress("nomvarr"||_N_),VARNUM);
    varId=symget("nomvarr"||left(put(_N_,4.)));
    run;
     
    %local num;
     
    data Des;
    if 0 then set Des nobs=VARNUM;
    call symput('num',left(put(VARNUM,8.)));
    stop;
    run;
     
     
    data cara;
    set  cara;
     
    /*data _null_;
    if 0 then set cara nobs=count;
    call symput('num',left(put(count,8.)));
    stop;
    run;*/;
     
     
    %do i=1 %to # 
     
        proc freq data=cara order=freq;
        tables &&nomvar&i/out=table&i;
    data tabl&i;
    set  table&i;
    if _N_ le 10;
     
    	%end;
    %do i=1 %TO &nb_tb;
    	proc sort DATA=tabl&i.; BY &&nomvar&i;run;
    	proc transpose DATA=tabl&i. out=tabl&i._tr;
    	BY &&nomvar&i;
    	run;
    	proc sort DATA=tabl&i._tr; BY _name_;run;
    	proc transpose DATA=tabl&i._tr out=tabl&i._tr;
    	id &&nomvar&i;
    	BY _name_;
    	run;
    	/*proc sort DATA=tabl&i._tr; BY _name_;run;
    	proc transpose DATA=tabl&i._tr out=toto&i._tr;
    	id cle;
    	BY _NAME_;
    	run;*/
     
    %end;
    %mend;
    %test5(exatraitPS,3);

  11. #11
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    En ce qui concerne les noms des variables des tables en sorties de la proc transpose c'est l'option :
    qui le contrôle tu peux la supprimer pour avoir des noms par défaut.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    Bahraoui,
    ton petit exemple fait bien la proc transpose, j'ai voulu faire un petit essai en enlevant l'argument de ID; et donc j'ai rien mi a sa suite, il ne m'a pas affiché la variable cle par defaut !
    il affiche nom de l'ancienne variable !

    c'est exactement pareil sur mes tables, en sortie de la proc transpose il me met nom de l'ancienne variable !
    et en mettant cle a la suite de by il ne reconnait pas dutout ça car cle n'existe pas pour lui dans mes tables, la proc sort je l'ai faite en prenant comme identifiant le nom de ma variable de chaque table!

    est ce qu'il ne faudrait peut etre pas faire un rename !
    merci encore

  13. #13
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Pour moi cle represente la variable var, comme dans l'exemple ci-dessous

    Var(COMAS) frequence effectifs
    mod debut 15 15
    fin 20 20
    hopital 30 30

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    oui c'est tout a fait ça !
    je l'ai remplacé par ma macro variable qui contenait touts les noms des variables de chaque table !
    le probleme c'estque mon tableau de sortie transpose bien sauf que a la sortie
    ma premeiere colonne m'affiche

    (nom de l'ancienne variable) debut fin hopital
    (acount)
    (percent)


    les modalités sont bien transposées sauf que j'aurais souhaité avoir a la place de (nom de l'ancienne variable) = coma et (acount) = effectif
    (percent)=pourcentage
    MERCI

  15. #15
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Il va falloir les renommer, moi je n'avais pas ce problème puisque effectif et frequence sont les noms de mes variables voir l'exemple ci-dessus.
    Soit tu les renommes après le transpose (if nom_var ='acount' then nom_var='effectif';...) ou avant (en utilisant un rename)

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    ben oui moi aussi effectif et frequence sont bien les noms de mes variables;
    dans la petite application que tu m'as envoyé il se passe exactement la meme chose après transposition sur la table de sortie finale le nom de variable n'est pas clé mais (nom de l'ancienne variable)

    excuse moi mon niveau est un peu bas en sas
    merci encore

  17. #17
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Citation Envoyé par mamiche Voir le message
    oui c'est tout a fait ça !
    je l'ai remplacé par ma macro variable qui contenait touts les noms des variables de chaque table !
    le probleme c'estque mon tableau de sortie transpose bien sauf que a la sortie
    ma premeiere colonne m'affiche

    (nom de l'ancienne variable) debut fin hopital
    (acount)
    (percent)


    les modalités sont bien transposées sauf que j'aurais souhaité avoir a la place de (nom de l'ancienne variable) = coma et (acount) = effectif
    (percent)=pourcentage
    MERCI
    Je ne comprends pas très bien le problème avec les noms des variables.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    en fait c'est le libellé de la variable qui change automatiquement, aulieu de me mettre le nom de ma variable qui s'appelle "coma" il m'est a la place comme nom "nom de l'ancienne variable"
    ton ton application pour les deux tables la sortie après transpose ne m'est pas comme libellé de variable "cle" mais "nom de l'ancienne variable"

    merci encore

  19. #19
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    C'est la proc transpose qui crée cette variable, il va falloir faire un rename.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    data tabl&i._tr; set tabl&i._tr(rename=(_name_=&&nomvar&i));run;
    Ajoute ce code après la derniere transpose.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    merci encore pour ce soutien,


    j'avais pensé a ça aussi, j'ai appliqué le script que tu m'as donné, ça ne marche toujours pas :

    voici ce que me signale le journal

    AVERTISSEMENT: 2 observations omises en raison de valeurs ID manquantes

Discussions similaires

  1. Concaténation de tables sas
    Par cococmoi dans le forum SAS Base
    Réponses: 6
    Dernier message: 18/07/2014, 15h16
  2. concaténer des tables à 2 colonnes verticalement
    Par stefsas dans le forum SAS Base
    Réponses: 1
    Dernier message: 28/05/2008, 17h16
  3. Concaténation de tables
    Par joshua12 dans le forum Access
    Réponses: 4
    Dernier message: 04/09/2006, 20h56
  4. Réponses: 2
    Dernier message: 12/05/2006, 08h35
  5. [SQL] Concaténation de table
    Par KikiWolf59 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 01/09/2005, 18h56

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