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

R Discussion :

Tableau de fréquences par année


Sujet :

R

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut Tableau de fréquences par année
    Bonjour à tous,

    J'essaie d'obtenir un tableau de fréquences avec plusieurs inputs mais je n'y parviens pas ... Mon jeu de données est de la forme suivante (que je nomme ensuite xxx):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Variable_B Année
           A              2012 
           B              2013 
           A              2013
           D              2012      
           ...                 ...
    Une autre variable (Variable_A) est construite de manière ad hoc sur l'échantillon et prend les modalités 1 à 6.

    Le but de la procédure est simple : je cherche à obtenir la part de la variable B par modalité de la variable A pour chaque année.


    Aucun soucis pour obtenir la part de la variable B par modalité de la variable A avec la procédure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >distri.eff <- table(xxx.Variable_A)
    > round(distri.eff/sum(distri.eff)*100,1)
    > round(100*prop.table(table(xxx.Variable_A,xxx$Variable_B),2),1)
    Le résultat est de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Variable_A        A         B        C        D
          1                 11.0   14.6   15.0   20.6
          2                 33.7   20.5   26.8   20.2
          3                 20.2   23.4   20.6   20.7
          4                 15.1   14.3   10.5      7.4
          5                 16.3   20.5   18.2   20.7
          6                   3.7      6.6      8.9   10.4

    Dans cette table, la somme de chaque ligne fait 100, on a donc bien la part de la variable B par modalité de la variable A. J'aimerais obtenir maintenant la même chose mais par année. En lancant differentes procédures, R me sort les tables par année. Dans ce cas, la somme des valeurs des 2 tables fait 100 pour chaque modalité de la variable B :
    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
     
    > distri.eff <- table(xxx.Variable_A, xxx$Année)
    > round(distri.eff/sum(distri.eff)*100,1)
    > round(100*prop.table(table(xxx.Variable_A,xxx$Variable_B,xxx$Année),2),1)
     
    , ,  = 2012
     
    Variable_A        A         B        C        D
          1                 10.1   12.3  19.5  12.8
          2                 20.3   12.3  10.5  13.2
          3                   8.3      6.6    4.8     7.0
          4                   7.5      6.6    4.4     5.0
          5                   6.6      6.8    6.9     7.4
          6                   4.1      1.4    1.5     2.5
     
    , ,  = 2013
     
    Variable_A        A              B               C                D
          1                   9.9         17.3          20.5          17.8
          2                 10.4         13.2          11.3          12.0
          3                    7.9          6.8           5.8              8.7
          4                    3.7          5.8           4.1              2.5
          5                 10.7         10.7           8.3             8.3
          6                    0.6          0.3           2.4              2.9
    Or ce n'est pas le résultat que je voudrais, je cherche à ce que la somme de chaque table soit égale à 100 ... Je n'en suis pas très très loin mais je crois que j'ai besoin d'un petit coup de main

    N'hésitez pas à me demander d'autres explications si je n'ai pas été assez clair.

    Merci d'avance.

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Bonjour,

    Je te propose cette solution pas forcément très élégante mais qui devrait avoir le mérite de marcher:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    aa<-with(xxx,tapply(B,list(A,B,Année),length))
     
    bb<-with(xxx,tapply(B,list(B,Année),length))
     
    for(i in 1:length(unique(xxx$A)))
    {
     
      for(j in 1:length(unique(xxx$Année))){
     
        aa[,i,j]<-aa[,i,j]/bb[i,j]
      }
    }
     
    aa

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Bonsoir,

    Merci pour ta réponse =)

    Néanmoins deux remarques :
    1/Qu'appelles tu x dans length(x) ? la longueur de ma table que j'avais appelé xxx dans l'exemple ?
    Je ne pense pas car il me renvoie l'erreur suivante :

    Erreur dans match.fun(FUN) :
    'length(xxx)' n'est pas une fonction, une chaîne de caractères ou un symbole

    J'ai essayé également avec xxx.Variable_A, xxx$Année et xxx$Variable_B à la place de x et ca ne marche pas ...

    J'ai essayé le code en enlevant le length dans aa et bb pour voir et la fonction for me renvoie l'erreur suivante :

    Erreur dans aa[, i, j] : nombre de dimensions incorrect

    Une erreur pour me sortir de là ?

    Merci d'avance

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Pardon c'est length pas length(x), j'édite le code du premier message.
    Length est la fonction a appliquer à tapply pour compter les cases de ton tableau.
    Ensuite on divise par la somme des colonnes (obtenues dans un autre tapply) pour avoir le pourcentage.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Merci une nouvelle fois pour ta réponse, mais ca ne marche toujours pas ...

    Avec ma variable A la procédure que tu m'as donné me renvoie ce message d'erreur : Erreur : indice hors limites

    Si je prends une autre variable (variable C a deux modalités) de mon jeu de données la procédure ne produit pas vraiment ce que je voulais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    , , 2012
     
                              A                B                  C               D 
    C modalité 1   0.5940594    0.5654762           346            64
    C modalité 2   0.4059406    0.4345238           307            52
     
    , , 2013
     
                              A                B                  C               D
    C modalité 1     0.5098039    0.5076142           390            69
    C modalité 2   0.4901961    0.4923858           326            57
    J'aurais en effet aimé avoir pour chaque ligne (modalités de la variable C - A initialement) la répartition dans les modalités de la variable B ; et ce par année :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
     
    , , 2012
     
                         A    B       C   D 
    C modalité 1   25    25    25   25
    C modalité 2   15    35    20   40
     
    , , 2013
     
                        A    B    C   D
    C modalité 1     5  20  15  60
    C modalité 2   10  20  30  40
    Et ce avec les modalités de la variable A plutôt que la variable C (qui a 6 modalités en fait).

    Je ne sais pas si je suis toujours clair

    Merci en tout cas pour ton aide.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par lmoulin Voir le message
    Merci une nouvelle fois pour ta réponse, mais ca ne marche toujours pas ...

    Avec ma variable A la procédure que tu m'as donné me renvoie ce message d'erreur : Erreur : indice hors limites

    Si je prends une autre variable (variable C a deux modalités) de mon jeu de données la procédure ne produit pas vraiment ce que je voulais :

    , , 2012

    A B C D
    C modalité 1 0.5940594 0.5654762 346 64
    C modalité 2 0.4059406 0.4345238 307 52

    , , 2013

    A B C D
    C modalité 1 0.5098039 0.5076142 390 69
    C modalité 2 0.4901961 0.4923858 326 57

    J'aurais en effet aimé avoir pour chaque ligne (modalités de la variable C - A initialement) la répartition dans les modalités de la variable B ; et ce par année :



    , , 2012

    A B C D
    C modalité 1 25 25 25 25
    C modalité 2 15 35 20 40

    , , 2013

    A B C D
    C modalité 1 5 20 15 60
    C modalité 2 10 20 30 40

    Et ce avec les modalités de la variable A plutôt que la variable C (qui a 6 modalités en fait).

    Je ne sais pas si je suis toujours clair

    Merci en tout cas pour ton aide.
    Je m'aperçois que ce que j'ai demandé dans mon dernier post comporte une erreur, je souhaite le total en ligne et non en colonne, j'aimerais donc avoir J'aurais en effet aimé avoir pour chaque colonne (modalités de la variable B la répartition dans les modalités de la variable C (initialement A) ; et ce par année :

    , , 2012

    C modalité A Cmodalité 2
    A 20 80
    B 10 90
    C 50 50
    D 80 20

    , , 2013

    C modalité A Cmodalité 2
    A 40 60
    B 15 85
    C 40 60
    D 30 70

    Merci d'avance, et désolé pour l'erreur

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Citation Envoyé par lmoulin Voir le message
    Je m'aperçois que ce que j'ai demandé dans mon dernier post comporte une erreur, je souhaite le total en ligne et non en colonne, j'aimerais donc avoir J'aurais en effet aimé avoir pour chaque colonne (modalités de la variable B la répartition dans les modalités de la variable C (initialement A) ; et ce par année :
    Pour avoir des pourcentages en ligne et non en colonne il suffit de récupérer les effectifs par année et par catégorie de la variable A (et non plus B) soit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bb<-with(xxx,tapply(B,list(A,Année),length))
    pour le deuxième tapply

    Ensuite on change les divisions pour avoir des pourcentages en ligne soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aa[i,,j]<-aa[i,,j]/bb[i,j]
    Le nouveau code complet s'écrit:

    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
    aa<-with(xxx,tapply(B,list(A,B,Année),length))
     
    bb<-with(xxx,tapply(B,list(A,Année),length))
     
    for(i in 1:length(unique(xxx$A)))
    {
     
      for(j in 1:length(unique(xxx$Année))){
     
        aa[i,,j]<-aa[i,,j]/bb[i,j]
      }
    }
     
     
    aa[is.na(aa)]<-0
    aa

    J'ai testé avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    B<-c("A","B","B","A","A","B","A","B","B","B","A","A")
    Année<-c("8","8","9","9","8","9","8","8","8","9","9","9")
    A<-c(1,1,1,2,2,3,3,3,4,4,4,4)
    et ca me renvoit
    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
     
    > aa
    , , 8
     
        A   B
    1 0.5 0.5
    2 1.0 0.0
    3 0.5 0.5
    4 0.0 1.0
     
    , , 9
     
              A         B
    1 0.0000000 1.0000000
    2 1.0000000 0.0000000
    3 0.0000000 1.0000000
    4 0.6666667 0.3333333

    Ce qui a l'air de coller à ce que tu veux.


    Avec ma variable A la procédure que tu m'as donné me renvoie ce message d'erreur : Erreur : indice hors limites
    Essaye de faire:
    Variable_A<-as.character(Variable_A) et relance pour voir.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Super !! Merci beaucoup pour ton aide cette fois ci ça marche ))

    Je signale le sujet comme résolu.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/03/2014, 10h23
  2. retour tableau d'objets par service web axis jboss
    Par TrollMaster dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 27/11/2005, 21h45
  3. [sql 9i] group by par années ;)
    Par booth dans le forum Oracle
    Réponses: 7
    Dernier message: 04/10/2005, 10h42
  4. Réponses: 2
    Dernier message: 03/10/2005, 22h16
  5. tableau javascript ecrit par une fonction asp
    Par LineLe dans le forum ASP
    Réponses: 4
    Dernier message: 03/11/2003, 08h38

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