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 :

Déplacer les NA à droite dans un data.frame


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut Déplacer les NA à droite dans un data.frame
    Hello,
    J'ai un data.frame ayant des valeurs manquantes (NA) et je cherche à les déplacer vers la droite.
    Le code suivant permet de générer des exemples de mon problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    genExample <- function(nbCol=7,nbLin=4)
    data.frame(matrix(runif(nbCol*nbLin)+sample(c(0,NA),nbCol*nbLin,TRUE,c(0.8,0.2)),ncol=nbCol))
    Si je l'exécute, j'obtiens par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    > (dd <- genExample())
             X1        X2        X3        X4         X5        X6         X7
    1 0.4885394 0.7426915        NA 0.2103834         NA        NA 0.08311188
    2 0.2607933        NA 0.4812214        NA 0.04364146 0.1707916         NA
    3 0.7486880 0.2456087 0.4043528        NA 0.13251084        NA 0.87925675
    4 0.5115420 0.8985941        NA        NA 0.40280238        NA 0.36108639
    Et je voudrais obtenir ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
             X1        X2        X3        X4         X5         X6         X7
    1 0.4885394 0.7426915 0.2103834        0.08311188 NA         NA         NA 
    2 0.2607933 0.4812214 0.04364146       0.1707916  NA         NA         NA
    3 0.7486880 0.2456087 0.4043528        0.13251084 0.87925675 NA         NA
    4 0.5115420 0.8985941 0.40280238       0.36108639 NA         NA         NA
    Pour faire ceci, j'ai déjà réalisé un code qui utilise une boucle. Mais dans mon vrai problème, je n'ai pas 6 lignes mais plus de 100000 lignes et mon code est bien trop lent (plus de 8 heures!).
    Pourriez-vous svp m'aider à faire un code optimal (apply(), vectorisation, ...) pour résoudre ce problème?
    Merci

  2. #2
    Membre éprouvé
    Inscrit en
    Mai 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 74
    Par défaut
    Salut
    On peut procéder comme ça :

    On crée une fonction qui permet de le faire sur un vecteur simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pushRightNA <- function(x)
        c(x[!is.na(x)], x[is.na(x)]))
    On génère une base de donnée avec ton code (utilise set.seed la prochaine fois pour rendre reproductible le résultat)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    set.seed(12345)
    (dd <- genExample())
     
    ##        X1      X2       X3        X4      X5      X6      X7
    ## 1 0.72090 0.45648       NA 0.7356850 0.38814 0.45373 0.64454
    ## 2 0.87577 0.16637       NA 0.0011366 0.40249 0.32675 0.38983
    ## 3 0.76098 0.32510 0.034535        NA 0.17896      NA 0.69854
    ## 4 0.88612 0.50922 0.152373 0.4624947 0.95166      NA 0.54406
    Donc on peut maintenant appliquer la fonction pushRightNA à chaque ligne en utilisant apply

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dd2 <- apply(dd, 1, pushRightNA)
    (dd2 <- as.data.frame(t(dd2), row.names = 1))
    ##        V1      V2        V3      V4      V5      V6 V7
    ## 1 0.72090 0.45648 0.7356850 0.38814 0.45373 0.64454 NA
    ## 2 0.87577 0.16637 0.0011366 0.40249 0.32675 0.38983 NA
    ## 3 0.76098 0.32510 0.0345354 0.17896 0.69854      NA NA
    ## 4 0.88612 0.50922 0.1523735 0.46249 0.95166 0.54406 NA

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    Ok super merci !

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

Discussions similaires

  1. Suppression de colonnes dans un data.frame
    Par ricoben dans le forum R
    Réponses: 1
    Dernier message: 13/04/2010, 17h13
  2. Mean par colonne dans une data frame
    Par manoir dans le forum R
    Réponses: 3
    Dernier message: 19/06/2009, 11h06
  3. Deleter les lignes manquantes dans une Data
    Par manoir dans le forum SAS Base
    Réponses: 5
    Dernier message: 23/04/2009, 15h49
  4. Réponses: 2
    Dernier message: 14/11/2008, 14h53
  5. Réponses: 3
    Dernier message: 14/03/2007, 09h24

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