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 :

Transformation matrice plusieurs catégories


Sujet :

R

  1. #1
    Membre actif
    Inscrit en
    Février 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 406
    Points : 207
    Points
    207
    Par défaut Transformation matrice plusieurs catégories
    Bonjour,

    Pour chaque couleur (A,B,C,D,E,F,G) correspond à une ou plusieurs catégories en même temps (1,2,3,4) dépendant de l'échantillon. Pour chaque catégories en même temps, il y a une séparation en virgule.



    Je souhaite simplifier mes données pour avoir un tableau, en comptabilisant comme suit :


    A B C D E F G

    1 1 0 0 0 0 0 0
    1,2 0 1 0 0 0 0 2


    à
    A B C D E F G

    1 1 0 0 0 0 0 0
    1 0 0.5 0 0 0 0 1
    2 0 0.5 0 0 0 0 1

    et finalement avoir

    A B C D E F G

    1 1 0.5 0 0 0 0 1
    2 0 0.5 0 0 0 0 1
    J'ai le script suivant , mais il duplique les lignes pour chaque catégorie, mais je n'arrive pas à diviser sur le nombre de ligne dupliqué :


    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
    DF <- read.table(text = " Color         Cat
     
        A             1
        B             1   
        C             4,2
        D             1,3
        E             1,2
        F             3
        G             5
        A             2
        B             3   
        C             1,2
        D             4,3
        E             3
        F             1
        G             1" , header = TRUE)
     
        DF = table(DF$Cat,DF$Color)
        cats <- strsplit(rownames(DF), ",", fixed = TRUE)
        DF <- DF[rep(seq_len(nrow(DF)), sapply(cats, length)),]
        DF <- as.data.frame(unclass(DF))
     
        DF$cat <- unlist(cats)
        DF <- aggregate(. ~ cat, DF, FUN = sum)

    Je vous remercie pour votre aide.

  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,
    Une proposition d'approche :
    • diviser les observations selon qu'elles sont mono/multi-modales ;
    • faire à part l’agrégation pour chacun des deux cas ;
    • rassembler les résultats de l'étape précédente.


    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
    DF <- read.table(text = " Color Cat
    A 1
    B 1
    C 4,2
    D 1,3
    E 1,2
    F 3
    G 5
    A 2
    B 3
    C 1,2
    D 4,3
    E 3
    F 1
    G 1" , header = TRUE)
     
    tblDF <- table(DF$Cat,DF$Color)
    cats <- strsplit(rownames(tblDF), ",", fixed = TRUE)
    donnéesCat <- as.data.frame(
        tblDF[rep(seq_len(nrow(tblDF)), lengths(cats)),],
        row.names = seq_len(nrow(tblDF))
    )
    donnéesCat$cat <- rep(sapply(cats, paste, collapse = ","), lengths(cats))
     
    modalités <- levels(factor(donnéesCat$cat))
    sélécteur <- donnéesCat$cat %in% modalités[nchar(modalités) == 1L]
    monoCat <- donnéesCat[sélécteur,]
    tmpMultiCat <- donnéesCat[!sélécteur,]
     
    traiterMultiCat <- function(contVal, contCat) {
        cpt <- dim(contVal)
        tmpEnv <- new.env(parent = emptyenv())
        tmpEnv$obj <- matrix(NA_real_, nrow = 2 * cpt[1L], ncol = cpt[2L])
        tmpEnv$cptObs <- 0
        tmpEnv$marqueur <- character(2 * cpt[1L])
     
        for (i in seq_len(cpt[1L])) {
            tmp <- unlist(contVal[i, ]) / length(contCat[i, ])
     
            sapply(contCat[i, ], function(x) {
                tmpEnv$cptObs <- tmpEnv$cptObs + 1L
                tmpEnv$obj[tmpEnv$cptObs, ] <- tmp
                tmpEnv$marqueur[tmpEnv$cptObs] <- x
            })
        }
     
        res <- as.data.frame(tmpEnv$obj)
        res$cat <- tmpEnv$marqueur
        colnames(res) <- colnames(tmpMultiCat)
        return(res)
    }
     
    multiCat <- aggregate(
        . ~ cat,
        traiterMultiCat(
            tmpMultiCat[, -8L],
            t(as.data.frame(lapply(tmpMultiCat$cat, strsplit, split = ",", fixed = TRUE)))
        ),
        FUN = sum
    )[, colnames(monoCat)]
     
    aggregate(. ~ cat, rbind(monoCat, multiCat), FUN = sum)

  3. #3
    Membre actif
    Inscrit en
    Février 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 406
    Points : 207
    Points
    207
    Par défaut
    Bonjour,

    Merci beaucoup pour votre réponse détaillée.

    En fait, je vais essayer de simplifier ma problématique, mon problème majeur c'est que j'ai plusieurs échantillons et chacun de ces echantillons donne une couleur qui appartient soit à une catégorie ou a plusieurs catégorie en même temps.

    J'ai fait donc un barplot : en X les couleurs apparues (A,B,C,D,E,F) et en Y le nombre d’occurrence. Ce qui est très simple à faire sous R.

    Après, je voudrais faire un barplot : en X les catégories et en Y le nombre d’occurrence des catégories. Pour une couleur qui a deux catégories à la fois, avec mon code elle va être comptabilisée deux fois et la somme d’occurrence de toutes les catégories ne correspondra pas au nombre d'occurrence des couleurs. C'est pour cela que j'ai cherché à diviser par le nombre de ligne dupliqué.

    Je ne sais pas si ma problématique est claire, je me rend compte qu'elle est peut etre plutôt problématique d'un point de vue méthodologique.

    Merci bien,

  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
    Bonjour,
    La problématique est ici toute autre que dans le message initial. Il me semble que vous souhaitez visualiser deux variables catégorielles en même temps. Pour ainsi faire, la fonction qui me vient à l'esprit est mosaicplot de la bibliothèque de base graphics. Il y a plusieurs façons de produire un diagramme en bâtons de plusieurs variables ; j'en vous propose une basée sur la bibliothèque ggplot2.

    1) Attachement de quelques bibliothèques et chargement des données
    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
    invisible(sapply(c("GGally", "ggplot2", "reshape2", "sjPlot", "vcd"), library, character.only = TRUE))
     
    DF <- read.table(text = " Color Cat
    A 1
    B 1
    C 4,2
    D 1,3
    E 1,2
    F 3
    G 5
    A 2
    B 3
    C 1,2
    D 4,3
    E 3
    F 1
    G 1" , header = TRUE, stringsAsFactors = FALSE)
     
    aplatirCat <- function(données, nomCat = "Cat", nomCoul = "Color") {
        tmp <- strsplit(données[[nomCat]], ",", fixed = TRUE)
        names(tmp) <- données[[nomCoul]]
        res <- reshape2::melt(tmp)
        colnames(res) <- c(nomCat, nomCoul)
        return(res[c(2L, 1L)])
    }
     
    DFRetravaillé <- aplatirCat(DF)
    tblDF <- table(DFRetravaillé$Cat, DFRetravaillé$Color)
    tblDF <- as.table(tblDF[as.character(seq_len(nrow(tblDF))),])
    matEffectifs <- matrix(as.vector(tblDF), ncol = length(unique(DFRetravaillé$Color)))
    colnames(matEffectifs) <- colnames(tblDF)
    row.names(matEffectifs) <- paste0("cat", seq_along(unique(DFRetravaillé$Cat)))
    donnéesDess <- reshape2::melt(tblDF)
    colnames(donnéesDess) <- c("Catégorie", "Couleur", "Occurrences")

    2) Différents diagrammes en bâtons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # avec ggplot2
    squelette <- ggplot(donnéesDess, aes(Catégorie, Occurrences, fill = Couleur)) +
        labs(x = "", y = "")
    dess1 <- squelette + geom_bar(stat = "identity")# position = "stack"
    dess2 <- squelette + geom_bar(stat = "identity", position = "dodge")
    dess3 <- squelette + geom_bar(stat = "identity", position = "fill")
     
    # avec sjPlot
    dess4 <- sjp.xtab(donnéesDess$Occurrences, donnéesDess$Catégorie, printPlot = FALSE)
     
    # affichage, sauvegarde, etc.
    print(dess1); print(dess2); print(dess3)
    suppressWarnings(print(dess4))
    3) Créer un mosaic plot à la ggplot2. La tâche peut aussi être considérée comme consistant en la visualisation de matrices de corrélation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dess5 <- ggfluctuation2(tblDF) +
        theme(axis.title.x = element_blank(), axis.title.y = element_blank())
    dess6 <- ggcorr(prop.table(matEffectifs))
    dess7 <- ggcorr(prop.table(aperm(matEffectifs)))
     
    # affichage, sauvegarde, etc.
    print(dess5); print(dess6); print(dess7)
    4) Pour aller plus loin avec les tableaux de contingences, la bibliothèque vcd est un bon candidat ; concernant la visualisation, voir ses fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    assoc(tblDF)
    cotabplot(matEffectifs)
    mosaic(matEffectifs)
    strucplot(matEffectifs)
    tile(matEffectifs)
     
    # La fonction mosaicplot mentionnée plus haut, de la bibliothèque graphics
    mosaicplot(tblDF)
    5) Vérifications de l'exactitude du dénombrement des couleurs et catégories
    > print(DF)
       Color Cat
    1      A   1
    2      B   1
    3      C 4,2
    4      D 1,3
    5      E 1,2
    6      F   3
    7      G   5
    8      A   2
    9      B   3
    10     C 1,2
    11     D 4,3
    12     E   3
    13     F   1
    14     G   1
    > print(addmargins(tblDF))
           A  B  C  D  E  F  G Sum
      1    1  1  1  1  1  1  1   7
      2    1  0  2  0  1  0  0   4
      4    0  0  1  1  0  0  0   2
      3    0  1  0  2  1  1  0   5
      5    0  0  0  0  0  0  1   1
      Sum  2  2  4  4  3  2  2  19
    N.B. Le code comporte des correctifs modifiant celui d'il y a quelques instants (week-end, non-relecture et tout ça).Nom : vis_mod.png
Affichages : 156
Taille : 15,2 Ko

  5. #5
    Membre actif
    Inscrit en
    Février 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 406
    Points : 207
    Points
    207
    Par défaut
    Avec un peu de retard, merci beaucoup pour votre aide précieuse, j'ai pu résoudre mon problème grace à votre code

    Merci

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

Discussions similaires

  1. Transformation matrice / table
    Par spirou33 dans le forum Access
    Réponses: 6
    Dernier message: 25/10/2007, 16h28
  2. [XSLT]Transformation en plusieurs pages .php
    Par mamiberkof dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 02/02/2007, 14h51
  3. [Typo3] Recherche CMS un article : plusieurs catégories
    Par SebCom dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 30/11/2006, 14h49
  4. [PHP] Transformation de plusieurs XML
    Par ammi2006 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 07/05/2006, 09h38

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