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:
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
1 pièce(s) jointe(s)
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:
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:
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:
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:
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:
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:
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,