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 :

Supprimer une ligne d'un tableau en fonction d'une valeur


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 40
    Par défaut Supprimer une ligne d'un tableau en fonction d'une valeur
    Bonjour,

    Je souhaite supprimer les valeurs aberrantes de mon jeu de données via les règles de normalité à + ou - 2 et 3 écarts types.

    Je commence dans mon code à supprimer les lignes contenant des données manquantes puis j'attaque ensuite les valeurs aberrantes.

    La première boucle for portant sur la variable i permet de balayer mon tableau colonne par colonne.
    Je calcule donc la taille (b), l'écart type (c) et la moyenne (d) de ma colonne.

    La deuxième boucle for portant sur la variable k va balayer chacune des lignes de ma colonne et vérifier si la valeur contenue est supérieur à la condition (d+2*c). Si la condition est remplie, on stocke la valeur de la case dans la variable (e) et on supprime ensuite la ligne correspondante.

    Voila dans la théorie, mais dans la pratique, cela ne fonctionne pas. Je reçois les messages d'erreur comme quoi (e) n'existe pas, et même en l'initialisant avant cela ne fonctionne pas.

    Je vous met en dessous le code correspondant.

    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
    dataset <- data.frame(dataset)
    dataset <- na.exclude(dataset)
    #Elimine les valeurs aberrantes
    a=length(dataset)
    for (i in 3:a)
    {
      b=length(dataset[,i])
      c=sd(dataset[,i])
      d=mean(dataset[,i])
      for (k in 1:b)
      {
            if (dataset[k,i]> d+2*c)
              e=dataset[k,i];
            dataset <- dataset[!(dataset[,i] %in% e),]
        #else (dataset[k,i]<d+2*c)
         # e=dataset[k,i]
           # dataset <- dataset[!(dataset[,i] %in% e),]
      }
    }
    Voyez vous comment faire s'il vous plait ?

    Cordialement,

    Jonathan

  2. #2
    Membre Expert
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Par défaut Supprimer une ligne d'un tableau en fonction d'une valeur
    Bonjour Jonathan,

    Voici une proposition à partir de votre précédent tableau. (C'est bien de montrer les données mais il est préférable de les fournir sous forme exploitable plutôt qu'en copie d'écran.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > df <- read.csv("D:/temp/test.txt")
    > library(prettyR)
    > stat <- describe(df,num.desc=c("mean","sd"))
    Description of df
    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
    > str(stat)
    List of 3
     $ Numeric:List of 5
      ..$ V1: Named num [1:2] 944 2105
      .. ..- attr(*, "names")= chr [1:2] "mean" "sd"
      ..$ V2: Named num [1:2] 45.8 64.7
      .. ..- attr(*, "names")= chr [1:2] "mean" "sd"
      ..$ V3: Named num [1:2] 50.92 1.56
      .. ..- attr(*, "names")= chr [1:2] "mean" "sd"
      ..$ V4: Named num [1:2] 76.2 108.2
      .. ..- attr(*, "names")= chr [1:2] "mean" "sd"
      ..$ V5: Named num [1:2] 54.63 2.65
      .. ..- attr(*, "names")= chr [1:2] "mean" "sd"
     $ Factor : list()
     $ Logical: list()
     - attr(*, "class")= chr "desc"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    > dfstat <- data.frame(stat$Numeric)
    > dfstat
                V1       V2        V3        V4        V5
    mean  944.3163 45.82632 50.921053  76.17895 54.631579
    sd   2105.1900 64.69919  1.564033 108.20677  2.650168
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > dfmax <- dfstat[1,]+2*dfstat[2,]
    > dfmax
               V1       V2       V3       V4       V5
    mean 5154.696 175.2247 54.04912 292.5925 59.93192
    Création d'une colonne supplémentaire pour identifier les lignes à supprimer :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    > nobs <- nrow(df)
    > nvar <- ncol(df)
    > for(i in 1:nobs){
    +   for(j in 1:nvar){
    +     if(df[i,j]>dfmax[j]) df[i,nvar+1]<-1
    +   }
    + }
    > df
            V1    V2   V3    V4 V5 V6
    1    59.79  31.2 52.1  52.1 57 NA
    2    53.64  31.1 49.0  50.1 54 NA
    3    54.18  30.9 48.9  50.7 60  1
    4  5438.00  31.0 48.9  50.1 55  1
    5    54.74  31.0 48.9  50.1 56 NA
    6    55.51  31.0 49.0  50.1 59 NA
    7    55.61  30.9 48.9  50.1 56 NA
    8  5539.00  31.1 48.9  50.1 57  1
    9    59.19  30.7 52.1  52.2 55 NA
    10   60.05  31.0 52.1  52.2 52 NA
    11   60.06  31.0 52.1  52.1 51 NA
    12   59.79  31.1 52.1 523.0 52  1
    13   60.03  31.2 52.1  52.1 51 NA
    14   59.65 313.0 52.0  52.0 52  1
    15   59.72  30.8 52.1  52.1 56 NA
    16   59.48  31.0 52.1  52.1 54 NA
    17 6034.00  31.0 52.1  52.1 55  1
    18   59.78  30.9 52.1  52.1 55 NA
    19   59.79  30.8 52.0  52.0 51 NA
    Sélection des observations :
    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
    > df <- df[is.na(df$V6),-ncol(df)]
    > df
          V1   V2   V3   V4 V5
    1  59.79 31.2 52.1 52.1 57
    2  53.64 31.1 49.0 50.1 54
    5  54.74 31.0 48.9 50.1 56
    6  55.51 31.0 49.0 50.1 59
    7  55.61 30.9 48.9 50.1 56
    9  59.19 30.7 52.1 52.2 55
    10 60.05 31.0 52.1 52.2 52
    11 60.06 31.0 52.1 52.1 51
    13 60.03 31.2 52.1 52.1 51
    15 59.72 30.8 52.1 52.1 56
    16 59.48 31.0 52.1 52.1 54
    18 59.78 30.9 52.1 52.1 55
    19 59.79 30.8 52.0 52.0 51
    Cordialement,
    Fichiers attachés Fichiers attachés

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 40
    Par défaut
    Bonjour mgdondon,

    Merci pour ta réponse. J'ai réussi à adapter ce script au mien. Désolé pour le manque d'informations concernant les données.

    Bonne journée.

    Jonathan

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

Discussions similaires

  1. Surligner une ligne d'un tableau en fonction d'un attribut
    Par moonshine34 dans le forum AngularJS
    Réponses: 5
    Dernier message: 10/05/2017, 15h12
  2. Trier une ligne d'un tableau en fonction d'une autre ligne
    Par thomas.leger dans le forum VB.NET
    Réponses: 6
    Dernier message: 30/07/2015, 17h39
  3. Réponses: 2
    Dernier message: 19/03/2015, 14h04
  4. [XL-2007] copier une une ligne d'un tableau en fonction de la valeur de la première cellule
    Par mentat dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/12/2009, 11h49
  5. Réponses: 3
    Dernier message: 26/11/2007, 06h06

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