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 :

prop.table par ligne sur plusieurs colonnes


Sujet :

R

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 50
    Points : 50
    Points
    50
    Par défaut prop.table par ligne sur plusieurs colonnes
    Bonjour,
    dans un dataframe (32 colonnes, 240 lignes) je veux faire un prop.table sur chaque ligne pour les colonnes 14 à 18
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     x <- round(prop.table(dataTest1[1,14:18]),2)
    me permet de le faire sur une ligne, en l’occurrence la première. Je peux bien sûr faire une boucle sur les 240 lignes mais je soupçonne qu'il y a plus efficace. Probablement avec quelque chose de la famille des 'apply'. Si quelqu'un pouvait me mettre sur la voie...
    Merci.

  2. #2
    Membre actif
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Points : 296
    Points
    296
    Par défaut
    Bonjour,
    Il suffit d'utiliser ... prop.table !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x <- round(prop.table(dataTest1[, 14:18]), 2)
    x <- round(prop.table(dataTest1[1,14:18]),2)
                                    ^^

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 50
    Points : 50
    Points
    50
    Par défaut
    c'est ce que j'ai tenté en premier mais ça ne marche pas. Ça me renvoie un tableau rempli de NA

  4. #4
    Membre actif
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Points : 296
    Points
    296
    Par défaut
    Le problème provient donc des données. Partons d'un exemple concret :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    xxx <- matrix(seq_len(18L), nrow = 3L)
    print(xxx)
    print(prop.table(xxx[, c(3L, 5L)]))
    print(round(prop.table(xxx[, c(3L, 5L)])))
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    1    4    7   10   13   16
    [2,]    2    5    8   11   14   17
    [3,]    3    6    9   12   15   18
    
              [,1]      [,2]
    [1,] 0.1060606 0.1969697
    [2,] 0.1212121 0.2121212
    [3,] 0.1363636 0.2272727
    
         [,1] [,2]
    [1,]    0    0
    [2,]    0    0
    [3,]    0    0
    Donc, prop.table ne génère pas en soi des valeurs manquantes. Quelles sont les sorties de la ligne ici-bas ?

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 50
    Points : 50
    Points
    50
    Par défaut
    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
    > str(dataTest1)
    'data.frame':	239 obs. of  32 variables:
     $ ticker        : chr  "AB" "AB" "AB" "AB" ...
     $ dat           : chr  "2015-03-20" "2015-03-23" "2015-03-24" "2015-03-25" ...
     $ vol           : num  114950 118266 50923 65764 266395 ...
     $ vc1           : num  39873 5345 1625 5757 34474 ...
     $ vc2           : num  46136 16495 21443 6838 122364 ...
     $ vc3           : num  11072 31425 13791 15065 60686 ...
     $ vc4           : num  9408 26086 11540 12093 36236 ...
     $ vc5           : num  8461 38915 2524 26011 12635 ...
     $ tc1           : num  163 36 17 45 194 86 113 28 27 11 ...
     $ tc2           : num  264 85 131 40 610 466 244 119 43 35 ...
     $ tc3           : num  77 164 93 Événement sans titre86 311 613 161 224 131 96 ...
     $ tc4           : num  59 156 35 81 212 143 88 28 121 65 ...
     $ tc5           : num  49 77 20 99 78 69 65 34 11 46 ...
     $ vtc1          : num  244.6 148.5 95.6 127.9 177.7 ...
     $ vtc2          : num  175 194 164 171 201 ...
     $ vtc3          : num  144 192 148 175 195 ...
     $ vtc4          : num  159 167 330 149 171 ...
     $ vtc5          : num  173 505 126 263 162 ...
     $ propvc1       : num  0.35 0.05 0.03 0.09 0.13 0.08 0.12 0.05 0.07 0.03 ...

  6. #6
    Membre actif
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Points : 296
    Points
    296
    Par défaut
    Citation Envoyé par yalehaire Voir le message
    [...] test1 est de type dataframe pas matrix, cela peut il avoir une incidance?
    Oui, cela est rédhibitoire, il faut travailler avec un array, matrix étant un array à deux dimensions. Ensuite, si vous faites ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    margin.table(as.matrix(c(dataTest1$vtc1, dataTest1$vtc2, dataTest1$vtc3, dataTest1$vtc4, dataTest1$vtc5), nrow = 5)), 2L)
    qu'avez-vous en sortie ?

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 50
    Points : 50
    Points
    50
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    margin.table(as.matrix(c(dataTest1$vtc1, dataTest1$vtc2, dataTest1$vtc3, dataTest1$vtc4, dataTest1$vtc5), nrow = 5)), 2L)
    Error: unexpected ',' in "margin.table(as.matrix(c(dataTest1$vtc1, dataTest1$vtc2, dataTest1$vtc3, dataTest1$vtc4, dataTest1$vtc5), nrow = 5)),"
    après avoir supprimé une parenthèse apparemment en surplus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    margin.table(as.matrix(c(dataTest1$vtc1, dataTest1$vtc2, dataTest1$vtc3, dataTest1$vtc4, dataTest1$vtc5), nrow = 5), 2L)
    [1] NA
    j'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test2 <- as.matrix(dataTest1[,13:19])
    x <- round(prop.table(test2[,2:6]),2)
    ca me donne bien un type matrix pour test2 mais le résultat est le même : une matrice de NA

  8. #8
    Membre actif
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Points : 296
    Points
    296
    Par défaut
    Citation Envoyé par yalehaire Voir le message
    > margin.table(as.matrix(c(dataTest1$vtc1, dataTest1$vtc2, dataTest1$vtc3, dataTest1$vtc4, dataTest1$vtc5), nrow = 5)), 2L)
    Error: unexpected ',' in "margin.table(as.matrix(c(dataTest1$vtc1, dataTest1$vtc2, dataTest1$vtc3, dataTest1$vtc4, dataTest1$vtc5), nrow = 5)),"
    Oups, désolé, mes doigts ont fourché à deux reprises (la parenthèse fermante en plus et as.matrix au lieu de matrix). Faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    margin.table(matrix(c(dataTest1$vtc1, dataTest1$vtc2, dataTest1$vtc3, dataTest1$vtc4, dataTest1$vtc5), nrow = 5), 2L)
    P.S. La prochaine réponse sera dans 2 ou 3 heures. L'idée est que si les sorties obtenues ci-haut ne contiennent pas un zéro, alors il suffira de travailler avec la matrice créée à l'aide des 5 colonnes. Si, par contre, il y a un zéro, vous serez en train de faire une division par zéro.

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 50
    Points : 50
    Points
    50
    Par défaut
    les NA venait du fait qu'il y avait des NA dans dataTest1 ce qui est résolu par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dataTest1[is.na(dataTest1)] <- 0
    mais ça ne m'avance guère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     print(prop.table(dataTest1[1,14:18])) # traitement d'une seule ligne
           vtc1      vtc2      vtc3      vtc4      vtc5
    1 0.2732269 0.1951971 0.1606054 0.1781079 0.1928627
     
     print(prop.table(dataTest1[1:2,14:18])) # traitement de plusieurs lignes
            vtc1       vtc2       vtc3       vtc4       vtc5
    1 0.11637156 0.08313749 0.06840433 0.07585892 0.08214323
    2 0.07063071 0.09231896 0.09115820 0.07955054 0.24042606
    On s'aperçoit que le calcul ne se fait par ligne par ligne mais sur l'ensemble de la table. sum(x) est toujours 1

    En tout cas merci pour le temps que vous me consacrez

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 50
    Points : 50
    Points
    50
    Par défaut
    finalement j'ai trouvé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x <- round(t(apply(dataTest1[,14:18], 1, prop.table)),2)
    ça marche même sur le dataframe

    Encore merci juliatheric

  11. #11
    Membre actif
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Points : 296
    Points
    296
    Par défaut
    Tant mieux que ça marche ! Une ou deux choses valent la peine d'être tout de même signalées. Quand vous aviez fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(prop.table(dataTest1[1,14:18]))
    le résultat était incorrect parce que vous aviez oublié de donner la valeur du deuxième argument, margin. Voir help("prop.table") pour comprendre pourquoi dans ce cas, il y a eu sommation de tous les éléments du tableau. Pourtant, dans le message initial, vous aviez tout bon sur ce point !

    La solution qui vous satisfait est une contorsion :
    • il n'y a plus de problème avec un objet data.frame parce que apply se charge de le convertir en array. Je cite help("apply") :
      If X is not an array but an object of a class with a non-null dim value (such as a data frame), apply attempts to coerce it to an array via as.matrix if it is two-dimensional (e.g., a data frame) or via as.array.
    • ce que fait apply dans le cas présent, sweep peut le faire, sweep étant en réalité la fonction qui se cache derrière prop.table. Vous avez donc superposé deux fonctions qui résolvent le problème de la même façon.

    Donc, qu'avez-vous en sorties avec le code suivant ? Le résultat correspond-il à ce que vous attendiez ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dataTest1[is.na(dataTest1)] <- 0
    prop.table(as.matrix(dataTest1[, 14:18]), 2L)

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 50
    Points : 50
    Points
    50
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    print(prop.table(as.matrix(dataTest1[, 14:18]), 2L))
                  vtc1        vtc2        vtc3        vtc4         vtc5
      [1,] 0.005353344 0.004369482 0.003491226 0.003863309 0.0028187827
      [2,] 0.003249166 0.004852035 0.004652541 0.004051314 0.0082503305
      [3,] 0.002091923 0.004092701 0.003600487 0.007988032 0.0020601747
      [4,] 0.002799662 0.004274221 0.004253134 0.003617158 0.0042891467
      [5,] 0.003888845 0.005015553 0.004737763 0.004140955 0.0026444351
      [6,] 0.004774066 0.004314976 0.003650018 0.004078448 0.0029131393
    Voici les premières lignes du résultat, ça ne fonctionne pas.

    Par contre en remplaçant 2L par 1L ça fonctionne (2 traitements par colonne, 1 pour un traitement par ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    print(prop.table(as.matrix(dataTest1[, 14:18]), 1L))
                 vtc1       vtc2       vtc3       vtc4       vtc5
      [1,] 0.27322685 0.19519714 0.16060538 0.17810790 0.19286273
      [2,] 0.12303192 0.16081077 0.15878882 0.13856939 0.41879910
      [3,] 0.11070320 0.18957011 0.17173530 0.38183861 0.14615278
      [4,] 0.14437585 0.19292623 0.19768872 0.16849304 0.29651616
      [5,] 0.19606329 0.22132974 0.21529448 0.18858265 0.17872984
    C'est effectivement plus cohérent que ma solution.
    Merci aussi pour vos explications qui m'ont permis de progresser.

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

Discussions similaires

  1. [DI 5.4.1] Partager équitablement n lignes sur plusieurs colonnes
    Par Elros dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 12/09/2014, 09h07
  2. Restitution champ ligne sur plusieurs colonnes
    Par mat_lefebvre dans le forum Excel
    Réponses: 2
    Dernier message: 18/09/2013, 14h56
  3. [XSL-FO] Mise en page ligne par ligne sur 2 colonnes.
    Par PouetteMan dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 26/12/2011, 18h14
  4. tri par moyenne sur plusieurs colonnes
    Par adr22 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/12/2007, 16h19
  5. Réponses: 2
    Dernier message: 11/01/2007, 12h56

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