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 :

Tri des colonnes sous plusieurs conditions


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2019
    Messages : 5
    Par défaut Tri des colonnes sous plusieurs conditions
    Bonjour,

    Je débute l'apprentissage de R tout juste dans le cadre d'un projet où j'ai besoin de traiter d'énormes tableau de données.

    J'attache le fichier des données ci-dessous comme le fichier joint.

    À partir de ces données, je dois extraire les colonnes qui satisfont les critères suivants:
    – Aucun NA, et;
    – Aucune donnée manquante, et;
    – Aucun caractère, c.-à-d qu’on ne garde que les colonnes ayant des chiffres, et;
    – Aucune constante, c.-à-d qu’on supprime toute colonne ayant une variance nulle.

    Est-ce que vous pouvez m'aider de clarifier comment extraire ces colonnes comme un nouveau dataframe svp?

    Merci d'avance!

    RCI.xlsx

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ## soit df ton dataframe de départ
    library(dplyr)
    resultat <- df  %>% select_if(is.numeric ) %>% ## on ne garde que les colonnes numériques
    select_if(function(x)!any(is.na(x))) %>% ## on ne garde que les colonnes sans NA
    select_if(function(x)length(unique(x))>1) ## on enlève les colonnes avec une seule valeur
    cdlt

  3. #3
    Membre émérite
    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
    Par défaut
    La réponse de Xavier-Pierre donne le résultat escompté mais il y a moyen de faire beaucoup plus simple et plus rapide à partir des fonctions de base de R :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     df[, unlist( lapply(df, function( x) is.numeric( x) & sum( is.na( x)) ==  0 & length( unique( x)) > 1))]
    La fonction microbenchmark du package de même nom nous renseigne sur les performances des deux solutions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    set.seed( 1) # assure un code reproductible
    microbenchmark( df[,unlist( lapply( df, function( x) is.numeric( x) & sum( is.na( x)) == 0 & length( unique( x)) > 1))], { df  %>% select_if(is.numeric ) %>% select_if(function(x)!any(is.na(x))) %>% select_if(function(x)length(unique(x))>1)})Unit: >microseconds
    >                                                                                                                                     expr      min        lq      mean    median        uq      max neval cld
    >                                    df[, unlist(lapply(df, function(x) is.numeric(x) & sum(is.na(x)) ==      0 & length(unique(x)) > 1))]   44.904   54.9545  101.0379   67.7835   78.2605 3341.682   100  a 
    > {     df %>% select_if(is.numeric) %>% select_if(function(x) !any(is.na(x))) %>%          select_if(function(x) length(unique(x)) > 1) } 3593.997 3690.6465 3968.3432 3892.2855 4156.3610 6434.041   100   b

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    bonjour faubry ,
    pour la rapidité je ne discute pas , pour la simplicité j'aurai pu écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    resultat<-  select_if(df,function(x)is.numeric(x) &    !any(is.na(x)) &  length(unique(x))>1)
    mais je trouve et j'avoue que c'est très subjectif que ce système de pipe et l'utilisation du tidyverse permet de décomposer la commande et être plus lisible
    cordialement

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2019
    Messages : 5
    Par défaut
    Bonjour,

    Je vous remercie de vos réponses qui sont très utiles.

    Cependant dans ce cas là, aucun paquetage R supplémentaire n’est autorisé. Est-ce que vous pouvez donc écrire des syntax qui sont basés seulement sur le paquetage originale de R svp ?

    Cordialement

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    tu prends la syntaxe de faubry

  7. #7
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Par défaut
    Citation Envoyé par faubry Voir le message
    La réponse de Xavier-Pierre donne le résultat escompté mais il y a moyen de faire beaucoup plus simple et plus rapide à partir des fonctions de base de R :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     df[, unlist( lapply(df, function( x) is.numeric( x) & sum( is.na( x)) ==  0 & length( unique( x)) > 1))]
    La fonction microbenchmark du package de même nom nous renseigne sur les performances des deux solutions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    set.seed( 1) # assure un code reproductible
    microbenchmark( df[,unlist( lapply( df, function( x) is.numeric( x) & sum( is.na( x)) == 0 & length( unique( x)) > 1))], { df  %>% select_if(is.numeric ) %>% select_if(function(x)!any(is.na(x))) %>% select_if(function(x)length(unique(x))>1)})Unit: >microseconds
    >                                                                                                                                     expr      min        lq      mean    median        uq      max neval cld
    >                                    df[, unlist(lapply(df, function(x) is.numeric(x) & sum(is.na(x)) ==      0 & length(unique(x)) > 1))]   44.904   54.9545  101.0379   67.7835   78.2605 3341.682   100  a 
    > {     df %>% select_if(is.numeric) %>% select_if(function(x) !any(is.na(x))) %>%          select_if(function(x) length(unique(x)) > 1) } 3593.997 3690.6465 3968.3432 3892.2855 4156.3610 6434.041   100   b
    Et si c'est la vitesse que l'on recherche on peut aussi faire avec les fonctions de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    df[sapply(df, function(x) is.numeric(x) && length(unique(x))>1) & colSums(is.na(df))==0]
    # ou encore
    df[sapply(df, function(x) is.numeric(x) && length(unique(x))>1 && !any(is.na(x)))]
    cdlt

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2019
    Messages : 5
    Par défaut
    Bonjour,

    J'ai déjà essayé avec les syntax ci-dessous mais ils ne marchent pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df[sapply(mydata, function(x) is.numeric(x) && length(unique(x))>1) & colSums(is.na(df))==0]
    Il y a une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "Error in colSums(is.na(df)) : 'x' must be an array of at least two dimensions
    In addition: Warning message: In is.na(df) : is.na() applied to non-(list or vector) of type 'closure' "
    Est-ce que vous pouvez m'aider à les corriger svp ?

    Merci d'avance !

  9. #9
    Membre émérite
    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
    Par défaut
    sapply est un wrapper pour lapply, fonction de base de type .Internal, dont le code inclut une fonction supplémentaire qui simplifie le résultat en tableau (par défaut) ou autre chose si l'argument simplify est TRUE (défaut) ou une valeur comme "array", "matrix", "data.frame")

    L'erreur provient du ) en trop après length( unique( x)) > 1

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

Discussions similaires

  1. Masquer-Afficher des colonnes sous conditions
    Par line78 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/06/2018, 17h45
  2. Réponses: 0
    Dernier message: 11/05/2018, 16h55
  3. Tri des colonnes au choix
    Par nora_ora dans le forum Oracle
    Réponses: 4
    Dernier message: 06/10/2005, 17h11
  4. [JTable] Tri des colonnes
    Par djskyz dans le forum Composants
    Réponses: 10
    Dernier message: 17/03/2005, 10h14
  5. Tri des colonnes d'une DBGRID
    Par Atrebate62 dans le forum Bases de données
    Réponses: 3
    Dernier message: 31/05/2004, 12h20

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