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 :

Test de valeur sur data.frame avec des NA


Sujet :

R

  1. #1
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    543
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 543
    Points : 239
    Points
    239
    Par défaut Test de valeur sur data.frame avec des NA
    Bonjour
    Je souhaite tester l'égalité entre des valeurs, sur deux variables qui possèdent des NA.
    Le problème est que je n'obtiens pas du tout ce que je veux. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    X <- data.frame(Id=c(1,2,3,4,5),V1=c(0,0,1,NA,1),V2=c(NA,0,0,1,1))
    X[X$V1 != X$V2,]
    Le résultat est le suivant :
    Id V1 V2
    NA NA NA NA
    3 3 1 0
    NA.1 NA NA NA
    Si j'y met un which(...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X[which(X$V1 != X$V2),]
    J'obtiens :
    Id V1 V2
    3 3 1 0
    Ce n'est pas non plus ce que je désire. Je voudrais avoir
    Id V1 V2
    1 1 0 NA
    3 3 1 0
    4 4 NA 1
    Bien sur, on peut aussi ajouter des contrôles sur les NA, de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X[which( (is.na(X$V1) & !is.na(X$V2)) | (is.na(X$V2) & !is.na(X$V1)) | (X$V1 != X$V2)),]
    Mais n'y a-t-il pas plus simple ?

  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
    bonjour ,
    essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X[X$V1 != X$V2|is.na(X$V1 != X$V2),]
    cdt

  3. #3
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    543
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 543
    Points : 239
    Points
    239
    Par défaut
    c'est pas mal, mais pas tout à fait suffisant.
    Exemple, j'ajoute une observation où les deux variables sont non renseignées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    X <- data.frame(Id=c(1,2,3,4,5,6),V1=c(0,0,1,NA,NA,1),V2=c(NA,0,0,NA,1,1))
    X[X$V1 != X$V2|is.na(X$V1 != X$V2),]
    Ta solution produit ceci
    Id V1 V2
    1 1 0 NA
    3 3 1 0
    4 4 NA NA
    5 5 NA 1
    Et on voit que la ligne 4 contient NA et NA, alors que je ne voudrais pas qu'elle apparaisse.

  4. #4
    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
    mais ça ne fonctionne pas si on a 2 NA

  5. #5
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    543
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 543
    Points : 239
    Points
    239
    Par défaut
    Citation Envoyé par xavier-Pierre Voir le message
    mais ça ne fonctionne pas si on a 2 NA
    Nos réponses se sont croisées.
    Oui ça ne fonctionne pas dans le cas de 2 NA
    Pas d'autre solution simple ?

  6. #6
    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.
    N'ayant aucune idée simple, j'ai construit une fonction bien bourrine et pas du tout vectorisée (c'est lamentable).
    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
    X <- data.frame(Id=c(1,2,3,4,5,6),V1=c(0,0,1,NA,1,NA),V2=c(NA,0,0,1,1,NA))
     
     
    comparaison <- function(x,y){
     
      if (is.na(x) & is.na(y)) {
        res <- TRUE 
      } else {
        if (is.na(x) | is.na(y)) {
          res <- FALSE
        } else {
          res <- (x == y)
        }
      }
      return (res)
    }
     
     
     
    purrr::map2_lgl(X$V1, X$V2, comparaison)
    Et puis j'ai eu honte et j'ai repris mes conditions en vectorisant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    comparaison2 <- function (v1, v2) {
      (is.na(v1) & is.na(v2)) |
        (!is.na(v1) & !is.na(v2) & v1 == v2)
    }
    comparaison2(X$V1, X$V2)
    Après je serais surpris que ce genre de fonction n'existe dans aucun package... mais Google ne m'en a pas proposé (j'ai cherché "elementwise vector comparison r function").
    Bon courage.
    Olivier

Discussions similaires

  1. Réponses: 11
    Dernier message: 03/05/2019, 17h21
  2. mean() sur ligne data.frame : problème des levels
    Par AustinPower999 dans le forum R
    Réponses: 0
    Dernier message: 01/04/2013, 22h11
  3. Image sur un input avec des valeurs qui se rajoutes par défaut X et Y
    Par yule dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/07/2012, 13h02
  4. Position des composants sur une frame avec layout null
    Par bellemlih dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 14/12/2007, 22h13
  5. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00

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