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 :

suppression de données


Sujet :

R

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2012
    Messages : 13
    Points : 6
    Points
    6
    Par défaut suppression de données
    Bonjour,
    Voici mon petit soucis. J'ai une colonne de données de températures qui se présente ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    6.43
    6.18
    15.93
    15.93
    15.93
    15.68
    7.68
    15.93
    15.68
    15.68 
    7.9
    7.9
    Je souhaiterais supprimer dans cet exemple les températures en gras (les 15.93 et 15.68°C) tout en gardant les autres, car je les ai détectées comme fausses dans ma série.

    J'ai pour l'instant une ligne de code insérée dans une boucle qui me supprime uniquement la première valeur fausse mais pas les suivantes (en gras ci-dessous (mêmes données qu'au-dessus)):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    6.43
    6.18
    15.93
    15.93
    15.93
    15.68
    7.68
    15.93
    15.68
    15.68 
    7.9
    7.9
    Ce que j'aimerais, comme vous l'avez compris, c'est qu'il me supprime également les valeurs fausses qui suivent (tous les 15.93 et 15.68°C dans cet exemple, mais aussi les autres températures se présentant ainsi dans mes données (valeur fausse détectée qui se répète)).
    Mon code est actuellement le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    out2NA <- function(x,maxi,seuil){
        #difx <- c(0,diff(x))  
        st1 <- NULL     
        st1 <- ifelse (abs(x)>maxi, NA,x)
        for (i in 2:length(x)){
        st1[i] <- ifelse ((abs(x[i])>=abs(x[i-1])+seuil)&&(abs(x[i])>=abs(x[i+1])-0.6),NA,x[i])    
        }
    Avec en gras la double condition qui me supprime actuellement la première valeur fausse mais pas les suivantes lorsqu'il y en a plusieurs à la suite.
    J'aimerais donc savoir comment faire sous R pour lui dire que lorsque pour un x[i] donné, si ma double condition en gras est vérifiée, qu'il remplace x[i] par NA (comme il le fait déjà), mais également les suivantes si l'écart entre la première valeur fausse x[i] et les suivantes est inférieur à 0.5°C par exemple?

    Merci pour votre aide et vos idées!

  2. #2
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Points : 417
    Points
    417
    Par défaut
    Bonjour,

    pour votre exemple, je ferais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x <- c(6.43, 6.18, 15.93, 15.93, 15.93, 15.68, 7.68, 15.93, 15.68, 15.68, 7.9, 7.9)
    (x[x != 15.93 & x != 15.68])
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [1] 6.43 6.18 7.68 7.90 7.90
    S'il y a beaucoup de données fausses, il faudrait les rassembler dans un vecteur et les supprimer de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x <- c(6.43, 6.18, 15.93, 15.93, 15.93, 15.68, 7.68, 15.93, 15.68, 15.68, 7.9, 7.9)
    vect <- c(15.93, 15.68)
    x[! x %in% vect]
    J'espère vous avoir fourni des pistes.

    Bonne journée

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2012
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci pour votre réponse lilly!

    Alors effectivement pour l'exemple cela pourrait marcher, mais le problème dans mes données, c'est que ces valeurs fausses peuvent être totalement aléatoires (pas forcément de valeur 15.93 ou 15.68). Le truc, c'est qu'il faut que je détecte et que je supprime les valeurs dont l'écart avec la précédente est supérieur à un certain seuil (d'où ma double condition dans mon code). Dans mes données, on voit que ça passe de 7.68 à 15.93 d'un coup, donc le 15.93 est faux. Mais tous les suivants aussi! Le problème est que la valeur fausse se répète (ca peut être donc pour d'autres valeurs, par exemple 25,35,35,35,35,26: supprimer les 35 car le premier 35 est supérieur au 25 d'un certain seuil.
    Avec ma double condition il supprime correctement à chaque fois la première valeur fausse mais pas les suivantes. Et c'est ça mon soucis, il faut que j'arrive à automatiser ça: supprimer la valeur selon la double condition et aussi les suivantes si la valeur supprimée et la valeur suivante sont identiques à + ou - 0.5 (car j'ai 35000 données à chaque fois sur plusieurs fichiers avec ce type d'erreur à détecter et à supprimer).
    J'espère que vous avez à peu près compris. C'est pas évident à comprendre et surtout à faire comprendre à R!

  4. #4
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Points : 417
    Points
    417
    Par défaut
    Re bonjour,

    voici une proposition à optimiser (si elle convient à votre problématique cette fois )
    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
    x <- c(6.43, 6.18, 15.93, 15.93, 15.93, 15.68, 7.68, 15.93, 15.68, 15.68, 7.9, 7.9)
    L <- length(x)
    i <- 2
    seuil <- function(x){
        while(i < L){
            if (x[i] - x[i-1] > 2) {
              x <- x[-i]
              L <- L - 1
            }
            else {
              i <- i + 1
            }
        }
        return(x)
    }
    seuil(x)
    Bonne journée

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2012
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci pour la proposition. Je vais tâcher d'y réfléchir.
    Je pense que la fonction repeat ou while peut être utile pour exprimer la répétition de ma valeur erronée, et la fonction all.equal pour exprimer la "plus ou moins égalité" entre la valeur détectée comme fausse et celle qui suit.
    Je vais essayer de faire fonctionner tout ça.

Discussions similaires

  1. suppression des données
    Par nabil1 dans le forum Oracle
    Réponses: 6
    Dernier message: 07/04/2006, 13h38
  2. Problème d'espace disponible après suppression de données
    Par carjo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/03/2006, 15h48
  3. Suppression de données
    Par ledaker dans le forum Access
    Réponses: 3
    Dernier message: 10/03/2006, 17h10
  4. [C#] Limites de C# quand a la suppression de données
    Par Anonymous dans le forum Windows Forms
    Réponses: 6
    Dernier message: 28/01/2005, 23h18
  5. Suppression de données
    Par Julien Dufour dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/12/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