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 :

Filtrer une table


Sujet :

R

  1. #1
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Points : 54
    Points
    54
    Par défaut Filtrer une table
    Bonjour à tous,

    Je dispose d'un fichier de donnée nommé "data", représentant des communes, des départements, et des type de Points d’intérêts.

    Souhaitant filtrer ma base de données avec les communes se situant uniquement dans le département du Var, j'ai appliqué la formule suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    data2 = subset(data, data$departement == "Var")
    Et cela a très bien marché.

    Malheureusement, en affichant un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    table(data2$type_POI)
    Il m'affiche tous les éléments de mon ancienne table, sous forme de "0".

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CH   CHN  CHNL  CHNM  CHNN  CLDA   CLF   CLG   CMN   CMP  CMPL CMPLA CMPMN  CMPO  CMPQ CMPRF  CMTY  CNFL 
        0     0     0     0     0    12     0     0    20     0     0     0     0     0    56     3     0     2     0     0     0     0     0     0     0     1 
      CNL  CNLA  CNLB  CNLD  CNLI  CNLN  CNLQ CNLSB  CNLX   CNS  CNSU  CNYN  CNYU  COLF  COMC  CONE  CONT  COVE  CRDR  CRKT  CRNT   CRQ  CRQS  CRRL  CRSU  CRTR 
        3     0     0     0     0     0     0     0     0     0     0     0    10     0     0     0     0     0     0     0     0    11     0    14
    Avec les valeurs que je souhaite afficher, noyées dans ce flow de "0".

    Existe t-il un moyen d'afficher que les éléments de ce tableau > 0, ou existe t-il un autre moyen de filtrer son tableau de données ?

    Merci à vous.

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonsoir
    une solution possible avec le tidyverse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    library(tydiverse)
    data2 <- data%>% filter(departement == 'Var')

  3. #3
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Ce comportement tient au type de tes variables : type_POI est un facteur, c'est à dire une donnée dont R a recensé les valeurs dans un dictionnaire (cf. fonction levels). Quand tu filtres avec select, le dictionnaire n'est pas mis à jour ; la fonction table l'utilise pour construire son résultat et tu vois des valeurs qui ne sont plus présentes dans tes données filtrées.
    Deux solutions : 1) transformer (as.character) type_POI en variable texte ou 2) appliquer la fonction droplevels à type_POI.
    Bon courage.
    Olivier

  4. #4
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Comme Olivier te l'as signalé POI est un facteur donc table raisonne non pas sur les valeurs présentes dans le tableau mais sur les niveaux du facteur donc quand table n'en trouve pas, la fonction retourne normalement zéro. Une solution est d'éliminer les niveaux inutilisés par la fonction droplevels comme le suggère Olivier.

    Ensuite la fonction travaille dans l'environnement des données qui lui sont passées en argument, donc l'argument subset fait référence à l'objet filtré dans cet environnement.

    Ton problème devrait être résolu par le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data2 <- droplevels( subset( data, departement == "Var"))
    Si tu préfères utiliser tidyverse, alors le code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    library(tydiverse) 
    data2 <- droplevels( filter( data, departement == 'Var')))

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour , j'ai encore répondu trop vite car dans la logique tidyverse on ferait plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    library(tydiverse)
    data2 <- data%>% filter(departement == 'Var') %>% count(departement)

  6. #6
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    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
    22
    23
    24
    25
     
    X <- factor( c( rep( toupper( letters[1:3]), 3), "C"))
    Y <- factor( c( rep( c( "X", "Y"), each=4), rep( "Z", 2)))
    donnees <- data.frame( X=X, Y=Y)
     
    # On verifie que Z n'est associe qu'avaec C
    with( donnees, table( X, Y))
     
    # Travail avec subset (fonction de base)
    res.sub <- subset( donnees, X == "A")
     
    # Travail avec tidyverse::filter
    res.fil <- filter( donnees, X == "A")
     
    # On verifie que les 2 approches donnent exactement la même chose
    summary( res.sub)
    summary( res.fil)
     
    # On applique table aux deux
    table( res.sub$Y)
    table( res.fil$Y)
     
    # On applique count aux deux
    count( res.sub, Y)
    count( res.fil, Y)
    Donc subset et filter fonctionnent de manière identique : ces deux fonctions gardent les lignes du data.frame qui correspondent à la condition mais ne modifient pas la définition des facteurs comme on peut le constater par le summary.

    table et count ont deux objectifs très diférents :
    - table permet de calculer des tableau de contingence et décompte le nombre d'occurences dans le data.frame de chaque niveau des facteurs, que ce niveau soit peuplé ou non,
    - count décompte le nombre d'occurences de chacune des valeurs existantes dans le data.frame, donc les niveaux non peuplés ne sont pas reportés. Cela n'empêche absolument pas qu'ils existent toujours dans la définition des facteurs. Leur existence peut poser problème dans certans cas.

    Donc, quelque soit l'approche utilisé, il faut utiliser droplevels pour supprimer ces niveaux.

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour faubry,
    tu as tout à fait raison ,
    je pense qu'il faut mieux laisser des personnes compétentes comme toi répondre
    je te souhaite une bonne journée

  8. #8
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Points : 54
    Points
    54
    Par défaut
    Merci à vous pour ces réponses

Discussions similaires

  1. filtrer une table excel avant de remplir un combobox
    Par alexsolex dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 21/10/2007, 19h56
  2. filtrer une table par programmation
    Par programeur dans le forum Delphi
    Réponses: 2
    Dernier message: 11/01/2007, 12h38
  3. Réponses: 5
    Dernier message: 06/06/2006, 14h12
  4. [C#] Filtrer une table
    Par diaboloche dans le forum ASP.NET
    Réponses: 8
    Dernier message: 05/12/2005, 15h17
  5. comment filtrer une table avec deux criteres càd 2 colonnes
    Par athmane2dz dans le forum Bases de données
    Réponses: 7
    Dernier message: 28/07/2004, 15h25

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