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

  1. #1
    Candidat au Club
    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
    Points : 3
    Points
    3
    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 éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 481
    Points : 836
    Points
    836
    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 é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
    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 éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 481
    Points : 836
    Points
    836
    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
    Candidat au Club
    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
    Points : 3
    Points
    3
    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 éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

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

  7. #7
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    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
    Candidat au Club
    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
    Points : 3
    Points
    3
    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 é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
    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

  10. #10
    Candidat au Club
    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
    Points : 3
    Points
    3
    Par défaut
    Bonjour faubry,

    Désolé de milliers questions, mais je suis un vrai newbie pour R

    Est-ce que vous pouvez m'expliquer de quoi ca sert "function (x)" et quel est le facteur "x" dans votre code ?

    Merci de m'éclairer !

  11. #11
    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
    Dans de nombreuses procédures de R , l'un des arguments, souvent de nom FUN, est une fonction. Dans ce cas l'aide spécifie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure( arg1, arg2, FUN, ...)
    1) Si la fonction n'a qu'un argument, on peut écrire par exemple si la fonction est le cosinus et que corps de la fonction contient FUN( arg1, ...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure( arg1=val1, arg2=val2, FUN=cos)
    De ce fait, quand R exécute la fonction, il calculera cos( arg1).
    2) Si la fonction a plusieurs arguments, il faut aussi les passer, c'est le rôle du ... Par exemple, supposons que la fonction est la moyenne mean, que l'argument 1 est un vecteur de valeur contenant des NA, on veut calculer la moyenne en supprimant mes NA et et les 10% des valeurs extrêmes, on doit alors utiliser les arguments supplémentaires na.rm et trim. On appellera alors la procédure comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure( arg1=val1, arg2=val2, FUN=mean, trim=0.1, na.rm=TRUE)
    R remplacera ... par les arguments supplémentaires et calculera mean( arg1, trim=0.1, na.rm=TRUE)
    3) A la place d'une fonction nommée pour FUN, on peut utiliser une fonction anonyme. On la codera alors par
    x étant son premier argument. Elle peut aussi avoir plusieurs arguments supplémentaires qui seront à la suite de x. Sa déclaration se fera à la suite du FUN et son appel de la même manière que les fonctions nommées comme je le fais dans mon code.
    4) Comme R peut passer les arguments par position ou par nom, si FUN se trouve à la bonne position comme dans mon code, il est inutile de nommer l'argument FUN par contre les arguments supplémentaires de la fonction doivent toujours être nommés.

  12. #12
    Candidat au Club
    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
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup de votre explication ca marche parfaitement pour moi !

+ 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