Colonne "0" avec fonction summary ?

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Justine Cristante
Messages : 8
Enregistré le : 14 Juin 2020, 16:07

Colonne "0" avec fonction summary ?

Messagepar Justine Cristante » 31 Juil 2021, 11:10

Bonjour

J'ai besoin d'aide sur une erreur concernant la fonction summary.
On m'a fourni une base de donnée excel contenant des informations sur des patients ayant (ou pas) eu divers types de traitement médicaux après une chirurgie en fonction de s'ils ont récidivé leur pathologie ou pas. J'ai transformé cette base en csv que j'implémente ensuite sur RStudio.

Le tableau (très raccourci) est en gros le suivant

Code : Tout sélectionner

recidive presence_TT_2  TT_2 presence_TT_3  TT_3
5         1             1    OD             1    MP
6         1             1    CG             1    OD
7         1             1 XIEII             0     
16        2             1    MP             1    CG
17        1             1    KE             1    MP
19        2             1    KE             1    CG
20        1             1    KE             1    KE
22        1             1    KE             1    RX
25        1             1    KE             1 XIEII
28        3             1    KE             1    CG


Le code reproductible est le suivant

Code : Tout sélectionner

recidive1 <- structure(list(recidive = structure(c(2L, 2L, 2L, 3L, 2L, 3L,
2L, 2L, 2L, 4L), .Label = c("0", "1", "2", "3"), class = "factor"),
    presence_TT_2 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
    TT_2 = structure(c(6L, 2L, 9L, 5L, 3L, 3L, 3L, 3L, 3L, 3L
    ), .Label = c("", "CG", "KE", "MIT", "MP", "OD", "RX", "SB",
    "XIEII"), class = "factor"), presence_TT_3 = c(1L, 1L, 0L,
    1L, 1L, 1L, 1L, 1L, 1L, 1L), TT_3 = structure(c(5L, 7L, 1L,
    2L, 5L, 2L, 3L, 8L, 11L, 2L), .Label = c("", "CG", "KE",
    "KE + MP", "MP", "MP + MIT", "OD", "RX", "RX + SB", "SB",
    "XIEII"), class = "factor")), row.names = c(5L, 6L, 7L, 16L,
17L, 19L, 20L, 22L, 25L, 28L), class = "data.frame")


Lorsque je fais la fonction summary j'ai un erreur car il me mets une colonne 0 sans rien.

Code : Tout sélectionner

summary(recidive1$TT_2)
         CG    KE   MIT    MP    OD    RX    SB XIEII
    0     1     6     0     1     1     0     0     1


Lorsque je retape moi-même au hasard 10 premières lignes de la base de donnée manuellement, l'erreur disparait !

Code : Tout sélectionner

recidive2 <- structure(list(TT_2 = structure(c(5L, 1L, 7L, 4L, 6L, 7L, 8L,
3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 4L, 4L, 8L, 2L, 5L), .Label = c("CG",
"KE", "MIT", "MP", "OD", "RX", "SB", "XIEII"), class = "factor"),
    TT_final = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 3L, 2L, 2L,
    2L, 2L, 1L, 1L, 2L, 2L, 1L, 3L, 3L, 2L, 1L), .Label = c("SB",
    "TM", "XIEII"), class = "factor"), recidive = structure(c(2L,
    2L, 3L, 4L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 2L,
    2L, 4L, 4L, 4L), .Label = c("0", "1", "2", "3"), class = "factor"),
    presence_TT_3 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L)), row.names = c(1L,
2L, 4L, 6L, 7L, 8L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L,
19L, 20L, 21L, 22L, 23L), class = "data.frame")

summary(recidive2$TT_2)
   CG    KE   MIT    MP    OD    RX    SB XIEII
    1     7     2     3     2     1     2     2


Je ne suis pas très à l'aise avec les structures de code, c'est la première fois que j'utilise dput() pour implémenter du code sur ce forum, mais je vois bien dans la structure de TT_2 du premier cas, il y a un label "" sans rien. Je ne vois pas d'où il peut venir puisqu'il n'y a pas de données manquantes pour cette colonne.
Cela m'embêtes car j'ai 8 colonnes de lignes de traitement à analyser, le tout sur une quarantaine de patient et cela me pose ensuite des problèmes pour générer les barplots puisqu'en faisant barplot(summary(recidive1$TT_2)), il m'affiche un colonne à 0 également...

Avez-vous une idée de ce qu'il peut se passer ?
En vous remerciant d'avance

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: Colonne "0" avec fonction summary ?

Messagepar Eric Wajnberg » 31 Juil 2021, 11:36

Effectivement, le problème vient du label vide "" dans le structure(). D'où vient cette instruction structure() ?

Vous avez à l'origine un tableau excel, que transofrmez en csv, et que vous importez dans R (pas dans RStudio ! ..). Il n'y a pas la nécessité ici d'utiliser une instruction structure(), il me semble.

Vous nous expliquez un peu plus ce que vous faire pour avoir votre table comme un objet de R ?

HTH, Eric.

Justine Cristante
Messages : 8
Enregistré le : 14 Juin 2020, 16:07

Re: Colonne "0" avec fonction summary ?

Messagepar Justine Cristante » 31 Juil 2021, 17:26

Bonjour

Merci pour votre première réponse

Pour implémenter mon tableau, j'utilise le classique read. csv une fois le tableau enregistré sous .csv

Cet objet initial s'appelle BDD.
Il contient les patients qui n'ont pas récidivé et donc qui n'ont pas de traitement et ceux qui ont récidivé
Les traitements s'important par défaut en chaîne de caractères, je les transforme ensuite en facteurs

Code : Tout sélectionner

BDD$TT_2 <- as.factor(BDD$TT_2)

Ceci pour tous les 8 colonnes de traitement et la colonne de traitement finale.


J'obtiens recidive1 en enlevant les patients qui ont le code "0" dans BDD$recidive

Code : Tout sélectionner

recidive1 <- subset(BDD, BDD$recidive == "1" | BDD$recidive == "2" | BDD$recidive == "3")


Pour avoir recidive2, je fais exactement la même chose, c'est juste que l'excel de départ a été créé avec des données fictives pour essayer de voir si j'avais le même problème quand je créais l'excel moi même...
Et la réponse c'est que je n'ai donc pas le même problème...
Dans un sens, ça m'embête presque, car cela veut dire qu'il faudrait que je recopie tout le tableau manuellement pour espérer que cela marche... En faisant un copier coller de la base initiale sur un nouvel Excel y compris en faisant un collage spécial "copier les valeurs", j'ai exactement le même soucis qu'avec la base initiale... Et en faisant un autre Excel avec que les patients qui ont récidiver pour enlever l'étape de subset, j'ai aussi le même soucis...

L'instruction structure provient de la fonction dput(), qui est proposé dans l'article du forum pour faire un code reproductible (viewtopic.php?f=1&t=7638) mais je n'utilise pas la fonction structure d'habitude. Quand je fais dput(recidive 1) dans R, il me mets le code que j'ai copié plus haut, en sachant que j'ai volontairement raccourci les dataframe à quelques lignes représentatives du problème. L'objet recidive1 a normalement 37 lignes.


Merci d'avance pour votre aide

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: Colonne "0" avec fonction summary ?

Messagepar Eric Wajnberg » 01 Aoû 2021, 05:17

Le problème vient de votre subset() qui crée des facteurs "vides".

Code : Tout sélectionner

> exemple=airquality
> exemple$Month=factor(exemple$Month)
> summary(exemple$Month)
 5  6  7  8  9
31 30 31 31 30
> suite=subset(exemple,exemple$Month==5)
> summary(suite$Month)
 5  6  7  8  9
31  0  0  0  0
>

Un moyen de vous en sortir est d'utiliser la fonction droplevels(), par exemple :

Code : Tout sélectionner

> summary(suite$Month)
 5  6  7  8  9
31  0  0  0  0
> summary(droplevels(suite$Month))
 5
31

HTH, Eric.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Colonne "0" avec fonction summary ?

Messagepar Mickael Canouil » 02 Aoû 2021, 09:21

Bonjour,

Code : Tout sélectionner

levels(recidive1$TT_2)
#> [1] ""      "CG"    "KE"    "MIT"   "MP"    "OD"    "RX"    "SB"    "XIEII" 

Code : Tout sélectionner

summary(droplevels(recidive1$TT_2)) # drop levels not used although "" is still a level ...
#>    CG    KE    MP    OD XIEII 
#>     1     6     1     1     1 

Code : Tout sélectionner

summary(factor(recidive1$TT_2)) # reconstruct factor with only existing levels
#>    CG    KE    MP    OD XIEII 
#>     1     6     1     1     1 


La solution serait de rendre explicite "" comme une valeur manquante, préférentiellement à l'import avec par exemple l'argument "na.strings":

Code : Tout sélectionner

BDD <- read.csv(filena.strings c("NA""")) 

Ou éventuellement après

Code : Tout sélectionner

BDD$TT_2 <- as.factor(ifelse(BDD$TT_2 == ""NA_character_TT_2)) 


Petite note, il ne devrait pas y avoir le nom du data.frame dans la condition d'un subset (et pareil pour toutes les fonctions du tidyverse).

Code : Tout sélectionner

exemple <- airquality
exemple$Month 
<- factor(exemple$Month)

Code : Tout sélectionner

subset(head(exemple), exemple$Month == 5)
#>       Ozone Solar.R Wind Temp Month Day
#> 1        41     190  7.4   67     5   1
#> 2        36     118  8.0   72     5   2
#> 3        12     149 12.6   74     5   3
#> 4        18     313 11.5   62     5   4
#> 5        NA      NA 14.3   56     5   5
#> 6        28      NA 14.9   66     5   6
#> NA       NA      NA   NA   NA  <NA>  NA
#> NA.1     NA      NA   NA   NA  <NA>  NA
#> NA.2     NA      NA   NA   NA  <NA>  NA
#> NA.3     NA      NA   NA   NA  <NA>  NA
#> NA.4     NA      NA   NA   NA  <NA>  NA
#> NA.5     NA      NA   NA   NA  <NA>  NA
#> NA.6     NA      NA   NA   NA  <NA>  NA
#> NA.7     NA      NA   NA   NA  <NA>  NA
#> NA.8     NA      NA   NA   NA  <NA>  NA
#> NA.9     NA      NA   NA   NA  <NA>  NA
#> NA.10    NA      NA   NA   NA  <NA>  NA
#> NA.11    NA      NA   NA   NA  <NA>  NA
#> NA.12    NA      NA   NA   NA  <NA>  NA
#> NA.13    NA      NA   NA   NA  <NA>  NA
#> NA.14    NA      NA   NA   NA  <NA>  NA
#> NA.15    NA      NA   NA   NA  <NA>  NA
#> NA.16    NA      NA   NA   NA  <NA>  NA
#> NA.17    NA      NA   NA   NA  <NA>  NA
#> NA.18    NA      NA   NA   NA  <NA>  NA
#> NA.19    NA      NA   NA   NA  <NA>  NA
#> NA.20    NA      NA   NA   NA  <NA>  NA
#> NA.21    NA      NA   NA   NA  <NA>  NA
#> NA.22    NA      NA   NA   NA  <NA>  NA
#> NA.23    NA      NA   NA   NA  <NA>  NA
#> NA.24    NA      NA   NA   NA  <NA>  NA  

Code : Tout sélectionner

subset(head(exemple), Month == 5)
#>   Ozone Solar.R Wind Temp Month Day
#> 1    41     190  7.4   67     5   1
#> 2    36     118  8.0   72     5   2
#> 3    12     149 12.6   74     5   3
#> 4    18     313 11.5   62     5   4
#> 5    NA      NA 14.3   56     5   5
#> 6    28      NA 14.9   66     5   6  


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Justine Cristante
Messages : 8
Enregistré le : 14 Juin 2020, 16:07

Re: Colonne "0" avec fonction summary ?

Messagepar Justine Cristante » 04 Aoû 2021, 17:03

Merci infiniement pour vos réponses !
Je ne connaissais pas droplevels, mais cela dit en remplaçant immédiatement les cases vides par NA à l'importation comme recommandé par Mickael, plus besoin de faire cette opération en effet :)

Et merci pour la recommandation sur subset et l'écriture des conditions !


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité