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 STAT Discussion :

Vote majoritaire sur table SAS


Sujet :

SAS STAT

  1. #1
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Par défaut Vote majoritaire sur table SAS
    Bonjour,


    Voici mon problème :
    Je désire faire sous SAS (9.1) un vote majoritaire sur une table. Je m'explique :

    voici ma table

    obs var1 var2 var3 var4 var5
    1 a a b b a
    2 b b b b c
    3 c a a a a


    je désire obtenir comme résultat la table suivante à partir de la première :

    vote
    a
    b
    a

    j'ai tenté une procédure proc transpose et proc freq sur ma première table, mais je n'arrive pas à récupérer le résultat du proc freq dans une table.


    Si quelqu'un peut m'aider...

    Merci d'avance pour vos réponses.

  2. #2
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Par défaut
    c'est comme cela :

    proc freq data= ;
    table .. / out= hop;
    run;

    pour ton comptage, tu ne voudrais pas recoder tes caractères en numériques et ensuite créer une variable finale qui serait le MAX(var1-var5).

    Ensuite, tu fait une freq dessus.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Par défaut
    Bonjour Datametric,

    merci pour le détail de la procédure freq, malheureusement, je ne vois pas comment obtenir ma table final...

    pour ton comptage, tu ne voudrais pas recoder tes caractères en numériques et ensuite créer une variable finale qui serait le MAX(var1-var5).
    -> Je ne pense pas que cela soit utile de recoder en numérique, de toute facon le max renverrait la valeur maximale et non pas la valeur la plus récurrente.

    Si tu as d'autres idées...

    Glaconutella.

  4. #4
    Membre Expert
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Par défaut
    Vu que tu veux des statistiques basées sur des lignes et non sur les colonnes le procédé est un peu plus compliqué.

    Une solution "bricolée" consiste à transposer tes donner puis faire tes analyses via une proc freq classique, avec une instruction table par variable de la table transposée. Valable si tu n'as pas trop de lignes dans ta table initiale.

  5. #5
    Membre Expert

    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
    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
     
    data toto;
    format var1 $1. var2 $1. var3 $1. var4 $1. var5 $1.;
    input var1 $ var2 $ var3 $ var4 $ var5 $;
    cards;
    a a b b a
    b b b b c
    c a a a a
    ;
    run;
     
    /*ODS TRACE ON; */
    ods listing close;
    ODS OUTPUT OneWayFreqs=outfreqs;
    proc freq data=toto;
    tables var1 var2 var3 var4 var5  ;
    run;
    ODS OUTPUT close;
    ods listing;
    /*ods trace off;*/
     
    data outfreqs1;set outfreqs;
    v=compress(var1||var2||var3||var4||var5);
    run;
    proc sql;
    create table outfreqs2 as
    select v, sum(Frequency) as sum
    from outfreqs1
    group by v
    order by sum desc;
    quit;

  6. #6
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Par défaut
    Bahraoui,

    merci pour ton code
    Malheureusement, cela ne fonctionne pas comme voulu...
    en effet en faisant un proc print de outfreqs2, j'obtiens :

    Le Système SAS 16:12 Tuesday, November 16, 2010 1

    Obs v sum

    1 a 7
    2 b 6
    3 c 2

    La dernière observation devrait être "a"...

  7. #7
    Membre Expert

    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
    Par défaut
    Il faut inverser le tri dans la proc SQL au lieu de desc tu mets asc.
    Clique sur RESOLU si ça répond à ton problème.

  8. #8
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Par défaut
    rrr, je ne veux pas abuser de ta gentilesse mais j'obtiens cette fois pour
    outfreqs2 :

    Le Système SAS 16:08 Tuesday, November 16, 2010 13

    Obs v sum

    1 c 2
    2 b 6
    3 a 7

    ... au lieu de a b a

  9. #9
    Membre Expert

    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
    Par défaut
    Est ce que tu peux me dire ce que tu attends comme solution?

  10. #10
    Membre Expert
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Par défaut
    La solution via un transpose:

    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
    data test;
    input var1 $ var2 $ var3 $ var4 $ var5 $;
    cards;
    a a b b a
    b b b b c
    c a a a a
    ;
    run;
     
    proc transpose out=test2;
    var var1-var5;
    run; 
     
    proc freq data=test2; 
    table col1/ out=ethop;
    table col2/ out=ethop2;
    table col3/ out=ethop3;
    run;
     
    data FINAL;
    set ETHOP(obs=1 keep=COL1 rename=(COL1=COL)) 
    	ETHOP2(obs=1 keep=COL2 rename=(COL2=COL)) 
    	ETHOP3(obs=1 keep=COL3 rename=(COL3=COL));
    run;
    Sauf erreur de ma part (auquel cas je suis preneur de la solution), ce n'est pas possible simplement en passant les méthodes proposées par datametric et bahraoui.

  11. #11
    Membre Expert

    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
    Par défaut
    La solution que je t'ai envoyé n'est pas bonne, mauvaise compréhension du sujet, je pensé que tu voulais compter le nombre de a, b et c et non
    obs var1 var2 var3 var4 var5
    1 a a b b a => a majouritaire
    2 b b b b c => b majouritaire
    3 c a a a a => a majouritaire

    La réponse de Manoutz est bonne.

  12. #12
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Par défaut
    Merci Manoutz et bahraoui.


    En effet, comme je l'écrit dans mon premier post, j'ai tenté un proc transpose suivi d'un proc freq (dont je n'arrivais pas à récupérer la sortie).
    Votre aide m'a donc été bénéfique de toute façon.

    Une solution "bricolée" consiste à transposer tes donner puis faire tes analyses via une proc freq classique, avec une instruction table par variable de la table transposée. Valable si tu n'as pas trop de lignes dans ta table initiale.
    Malheureusement, mon proc transpose sur ma vrai table me retourne 150 lignes...
    je vais essayer de faire ça avec une macro et une boucle.

    Merci pour votre aide.

  13. #13
    Membre Expert
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Par défaut
    Etant donné la situation, tu devras probablement passer par du bricolage. Tu peux essayer par des boucles comme tu le dis, transposer tes données autrement que par un transpose, ou en core fractionner tes données en entrée en plusieurs sous tables pour que ca passe en transpose.

  14. #14
    Membre Expert

    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
    Par défaut
    je dois partir, ce code te parmettra d'éviter la proc transpose...
    bon courage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    data t(keep=sum_a sum_b sum_c); set test;
    array  x{*} _CHARACTER_;
    sum_a=0;sum_b=0;sum_c=0;
    do i=1 to dim(x);
    	if x(i)="a" then sum_a=sum_a+1;
    	if x(i)="b" then sum_b=sum_b+1;
    	if x(i)="c" then sum_c=sum_c+1;
    end;
    run;

  15. #15
    Membre chevronné
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    Salut,
    Un bricolage avec des array :

    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
    DATA vote;
    input var1 $ var2 $ var3 $ var4 $ var5 $;
    cards;
    a a b b a
    b b b b c
    c a a a a
    ;
    run;
     
    data compte;
    set vote;
    array vote(5)  var1-var5;
    array compte(5) _NUMERIC_ compte1-compte5 ;
     
    do i=1 to 5;
     
    	do j=i to 5;
    		if vote(j)=vote(i) then compte(i)=sum(compte(i),1);
    	end;
     
    end;
     
    max_vote=max(of compte(*));
     
    do i=1 to 5 until (compte(i)=max_vote);
    	elu=vote(i);	
    	nombre_de_vote=compte(i);
    end;
     
    keep var: elu nombre_de_vote ;
    run;

  16. #16
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Par défaut
    Voilà ce que j'ai fait grace à toutes vos idées, la table est bien sur fictive mais je peux posséder une table beaucoup plus grande ( la boucle ira plus loin).

    En tout cas, merci à tous !!


    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
    DATA test;
    input var1 $ var2 $ var3 $ var4 $ var5 $;
    cards;
    a a c c a
    b c c b c
    c a a a a
    ;
    run;
     
    proc transpose data=test out=test2 PREFIX=col;
    var var1-var5;
    run; 
     
    %MACRO vote(test2);
    data ethop;
    run;
     
    %DO i=1 %TO 3;
    proc freq DATA=&test2; 
    TABLE col&i/ out=ethop&i;
    run;
     
    proc sort data=ethop&i;
    by DESCENDING count;
    run;
     
    data ethop;
    set ethop;
    set ethop&i (obs=1 keep=COL&i) ;
    run;
    %END;
     
    %MEND;
     
    %vote(test2);
     
    proc print data=ethop;
    run;

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

Discussions similaires

  1. Modification d'une cellule sur une table SAS
    Par SOS SAS dans le forum Débutez
    Réponses: 2
    Dernier message: 21/02/2014, 15h12
  2. Boucle sur une table SAS requete SQL
    Par tidou95220 dans le forum SAS Base
    Réponses: 10
    Dernier message: 19/02/2013, 11h27
  3. Réponses: 20
    Dernier message: 30/08/2012, 14h15
  4. Erreur 145 sur table mysql
    Par ramses83 dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/09/2007, 21h09
  5. [Sybase] Utilisation indexes sur table Proxy
    Par MashiMaro dans le forum Sybase
    Réponses: 2
    Dernier message: 20/02/2004, 10h20

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