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 :

dataframe filtré pourtant ça apparait toujours dans levels


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Par défaut dataframe filtré pourtant ça apparait toujours dans levels
    Bonjour,

    Je connais très peu R, je m’y mets petit à petit. Pour l’instant, je dois faire tourner un programme que je n’ai pas écrit. Tout fonctionne bien sauf à un endroit et je ne comprends pas pourquoi.

    J’ai un data frame x
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x<-data.frame(FILTRE,NOM)
    J’ai un sous data-frame x_S qui ne contient pas "filtre1"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x_ST<-subset(x[1:2],substr(x$NOM,1,1)=="C" & x$FILTRE!="filtre1")
    Si je fais
    Ça m'affiche les levels et ça me met filtre1 ce qui est normal.

    Si je fais
    Ça m'affiche les levels et ça me met filtre1 ce qui n'est pas normal d'après moi puisque j'ai filtré pour ne pas que filtre1 apparaisse. Pourquoi filtre1 apparait il ?

    R considère que filtre1 est toujours présent dans x_ST (meme s'il détecte 0 ligne correspondant) => quand après je fais un boxplot, ça me génère une erreur car dans ma matrice, je mets 10 paramètres alors que R considère qu'il m'en manque un car le total devrait être n+1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    boxplot(x_ST [,2]~ x_ST [,1], at=c(1,2,3,4,5,6,7,8,9,10))
    Message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Erreur dans bxp(list(stats = c(0.028, 0.125, 0.183, 0.304, 0.57, 0.005, 0.045, 0.001 : 
      'at' doit avoir la même longueur que 'z$n', c'est-à-dire 11
    Je ne comprends donc pas pourquoi il attend 11 paramètres et non 10.
    Merci de votre aide.

  2. #2
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Bonjour,

    C'est un comportement normal : sauf si c'est demandé explicitement, R considère qu'on ne supprime pas les modalités, mais juste leurs occurrences.

    Voici une façon pas très propre de s'en sortir (la prochaine fois donne un exemple qu'on puisse faire tourner... pour cette fois je l'ai créé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    x <- data.frame(FILTRE=rep(c("filtre1", "filtre2"), 5),
                    NOM=paste(rep(c("C", "A"), each=5), "nom", sep=""))
    
    x_ST<-subset(x[1:2],substr(x$NOM,1,1)=="C" & x$FILTRE!="filtre1")
    
    x_ST[ ,1] <- x_ST[ , 1][ , drop=TRUE]
    ## ou plus lisible :
    x_ST$FILTRE <- x_ST$FILTRE[ , drop=TRUE]
    
    x_ST[1, 1]
    Sinon, je me suis créé une fonction qui fait ça pour tout ou partie d'une data.frame :
    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
    dropLevels.f <- function(df, which=NULL)
    {
        ## Purpose: Supprimer les 'levels' non utilisés des facteurs d'une
        ##          data.frame.
        ## ----------------------------------------------------------------------
        ## Arguments: df : une data.frame
        ##            which : indice des colonnes à inclure (toutes par défaut).
        ## ----------------------------------------------------------------------
        ## Author: pitipoisson, Date: 10 août 2010, 13:29
     
        if (class(df) != "data.frame")
        {
            stop("'df' doit être une data.frame")
        }else{
            if (is.null(which))
            {
                x <- as.data.frame(sapply(df, function(x)
                                      {
                                          return(x[ ,drop=TRUE])
                                      }, simplify=FALSE),
                                   stringsAsFactors=FALSE)
            }else{                          # Cas où seulement certaines colonnes sont traitées.
                x <- df
     
                x[ , which] <- as.data.frame(sapply(df[ , which, drop=FALSE],
                                                    function(x)
                                                {
                                                    return(x[ ,drop=TRUE])
                                                }, simplify=FALSE),
                                             stringsAsFactors=FALSE)
            }
     
            return(x)
        }
    }
    Qui peut-être utilisée comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x_ST <- dropLevels.f(subset(x[1:2],substr(x$NOM, 1, 1)=="C" & x$FILTRE!="filtre1"),
                         which=1)

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Par défaut


    Merci bcp. C'est exactement cela.
    Merci pour les 2 méthodes (la méthode rapide pas très propre et la fonction que tu as développée).

    Trop bien !

    Bonne journée.

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

Discussions similaires

  1. [MySQL] Filtre via formulaire HTML/PHP dans Base mySQL
    Par Al3x dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 14/01/2006, 16h27
  2. Réponses: 1
    Dernier message: 14/11/2005, 22h38
  3. Réponses: 1
    Dernier message: 05/10/2005, 15h13
  4. [Q] que faire quand un plugin n'apparait pas dans eclipse
    Par zolive dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 30/08/2004, 23h38
  5. Réponses: 4
    Dernier message: 15/01/2004, 22h53

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