Supprimer des valeurs dans un tableau en fonction de leurs index

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Rigal Jules
Messages : 3
Enregistré le : 19 Avr 2023, 13:51

Supprimer des valeurs dans un tableau en fonction de leurs index

Messagepar Rigal Jules » 06 Oct 2023, 09:27

Bonjour,
je shouaiterais retirer des outliers d'un tableau afin de créer un nouveau dataset sans les outlier.

Pour se faire, mon idée était de détecter les outliers, acquérir leurs index et les retirer de mon dataset à l'aide de cet Index.

J'ai donc essayé ça :
morceau tableau en question :
injection body_length
1 inj_WT 3.123
2 inj_WT 3.050
3 inj_WT 3.105
4 inj_WT 3.080
5 inj_WT 3.228
6 inj_WT 2.884
7 inj_WT 3.126
8 inj_WT 2.993
9 inj_WT 3.235
10 inj_WT 2.853
11 inj_WT 2.782
12 inj_WT 3.166
13 inj_WT 3.076
14 inj_WT 3.083
15 inj_WT 3.101
16 inj_WT 3.301
17 inj_WT 2.891
18 inj_WT 3.069
19 inj_WT 3.166

------------------------------------------------------

DATA<-read.table(file.choose(),fill=TRUE,header=TRUE)

outlier_inj_WT <- boxplot.stats(DATA[DATA["injection"]=="inj_WT",c("body_length")])$out
show(outlier_inj_WT)
outlier_inj_WT_idx <-which(DATA$body_length %in% c(outlier_inj_WT))
show(outlier_inj_WT_idx)

DATA_WO=DATA[c(-outlier_inj_WT_idx)]

-------------------------------------------------------

Mon problème étant que mon nouveau jeu de donné DATA_WO est exactement le même que DATA et aucun outlier n'a été retiré bien que certains ont été détectés.

Quelqu'un saurait d'où proviens le problème et si il existe un autre moyen de les retirer de mon dataset ?

Merci d'avance !

Facundo Muñoz
Messages : 156
Enregistré le : 04 Juil 2019, 09:58
Contact :

Re: Supprimer des valeurs dans un tableau en fonction de leurs index

Messagepar Facundo Muñoz » 06 Oct 2023, 11:56

Bonjour,

Pour moi ça marche.

Code : Tout sélectionner

library(tidyverse)
library(data.table)

dat <- tibble::tribble(
  ~injection, ~body_length,
       "inj_WT",  3.123,
       "inj_WT",  3.050,
       "inj_WT",  3.105,
       "inj_WT",  3.080,
       "inj_WT",  3.228,
       "inj_WT",  2.884,
       "inj_WT",  3.126,
       "inj_WT",  2.993,
       "inj_WT",  3.235,
       "inj_WT",  2.853,
       "inj_WT",  2.782,
       "inj_WT",  3.166,
       "inj_WT",  3.076,
       "inj_WT",  3.083,
       "inj_WT",  3.101,
       "inj_WT",  3.301,
       "inj_WT",  2.891,
       "inj_WT",  3.069,
       "inj_WT",  3.166
  )

dat <- data.table(dat)
outlier_inj_WT <- boxplot.stats(dat$body_length)$out
outlier_inj_WT_idx <-which(dat$body_length %in% c(outlier_inj_WT))

dat_wo <- dat[c(-outlier_inj_WT_idx)]

nrow(dat)
#> [1] 19
nrow(dat_wo)
#> [1] 18

setdiff(dat, dat_wo)
#>    injection body_length
#> 1:    inj_WT       2.782

<sup>Created on 2023-10-06 with [reprex v2.0.2](https://reprex.tidyverse.org)</sup>


Si vous apportez un code reproductible on pourra peut-être vous aider à identifier le problème.

Cordialement,
ƒacu.-

Rigal Jules
Messages : 3
Enregistré le : 19 Avr 2023, 13:51

Re: Supprimer des valeurs dans un tableau en fonction de leurs index

Messagepar Rigal Jules » 06 Oct 2023, 13:00

Qu'entendez vous par code reproductible ?
Je suis encore débutant avec R et ne connais pas encore les termes.

voiçi un exemple complet de mon problème :

Code : Tout sélectionner

   injection body_length
1     inj_WT       3.123
2     inj_WT       3.050
3     inj_WT       3.105
4     inj_WT       3.080
5     inj_WT       3.228
6     inj_WT       2.884
7     inj_WT       3.126
8     inj_WT       2.993
9     inj_WT       3.235
10    inj_WT       2.853
11    inj_WT       2.782
12    inj_WT       3.166
13    inj_WT       3.076
14    inj_WT       3.083
15    inj_WT       3.101
16    inj_WT       3.301
17    inj_WT       2.891
18    inj_WT       3.069
19    inj_WT       3.166
20    inj_WT       3.226
21    inj_WT       3.168
22    inj_WT       3.128
23    inj_WT       3.157
24    inj_WT       2.785
25    inj_WT       3.128
26    inj_WT       3.066
27    inj_WT       3.243
28    inj_WT       3.207
29    inj_WT       3.141
30    inj_WT       3.127
31    inj_WT       3.191
32    inj_WT       3.425
33    inj_WT       3.160
34    inj_WT       3.088
35    inj_WT       3.130
36    inj_WT       3.214
37    inj_WT       3.018
38    inj_WT       3.172
39    inj_WT       3.162
40    inj_WT       3.049
41    inj_WT       3.298
42    inj_WT       3.068
43    inj_WT       3.240
44    inj_WT       3.125
45    inj_WT       3.204
46    inj_WT       3.269
47    inj_WT       2.952
48    inj_WT       3.046
49    inj_WT       2.771
50   non_inj       3.246
51   non_inj       3.237
52   non_inj       2.910
53   non_inj       3.154
54   non_inj       3.296
55   non_inj       3.183
56   non_inj       2.851
57   non_inj       3.185
58   non_inj       3.291
59   non_inj       3.219
60   non_inj       3.250
61   non_inj       3.038
62   non_inj       3.324
63   non_inj       3.099
64   non_inj       3.113
65   non_inj       3.216
66   non_inj       3.215
67   non_inj       3.246
68   non_inj       2.981
69   non_inj       3.158
70   non_inj       3.094
71   non_inj       3.224
72   non_inj       3.250
73   non_inj       3.124
74   non_inj       3.278
75   non_inj       2.850
76   non_inj       3.240
77   non_inj       3.259
78   non_inj       3.231
79   non_inj       3.227
80   non_inj       2.897
81   non_inj       2.886
82   non_inj       2.922
83   non_inj       3.357
84   non_inj       3.327
85   non_inj       2.894
86   non_inj       2.950
87   non_inj       3.327
> outlier_inj_WT <- boxplot.stats(DATA[DATA["injection"]=="inj_WT",c("body_length")])$out
> show(outlier_inj_WT)
[1] 2.853 2.782 2.785 3.425 2.771
> outlier_inj_WT_idx <-which(DATA$body_length %in% c(outlier_inj_WT))
> show(outlier_inj_WT_idx)
[1] 10 11 24 32 49
> DATA_WO=DATA[c(-outlier_inj_WT_idx)]
> DATA_WO
   injection body_length
1     inj_WT       3.123
2     inj_WT       3.050
3     inj_WT       3.105
4     inj_WT       3.080
5     inj_WT       3.228
6     inj_WT       2.884
7     inj_WT       3.126
8     inj_WT       2.993
9     inj_WT       3.235
10    inj_WT       2.853
11    inj_WT       2.782
12    inj_WT       3.166
13    inj_WT       3.076
14    inj_WT       3.083
15    inj_WT       3.101
16    inj_WT       3.301
17    inj_WT       2.891
18    inj_WT       3.069
19    inj_WT       3.166
20    inj_WT       3.226
21    inj_WT       3.168
22    inj_WT       3.128
23    inj_WT       3.157
24    inj_WT       2.785
25    inj_WT       3.128
26    inj_WT       3.066
27    inj_WT       3.243
28    inj_WT       3.207
29    inj_WT       3.141
30    inj_WT       3.127
31    inj_WT       3.191
32    inj_WT       3.425
33    inj_WT       3.160
34    inj_WT       3.088
35    inj_WT       3.130
36    inj_WT       3.214
37    inj_WT       3.018
38    inj_WT       3.172
39    inj_WT       3.162
40    inj_WT       3.049
41    inj_WT       3.298
42    inj_WT       3.068
43    inj_WT       3.240
44    inj_WT       3.125
45    inj_WT       3.204
46    inj_WT       3.269
47    inj_WT       2.952
48    inj_WT       3.046
49    inj_WT       2.771
50   non_inj       3.246
51   non_inj       3.237
52   non_inj       2.910
53   non_inj       3.154
54   non_inj       3.296
55   non_inj       3.183
56   non_inj       2.851
57   non_inj       3.185
58   non_inj       3.291
59   non_inj       3.219
60   non_inj       3.250
61   non_inj       3.038
62   non_inj       3.324
63   non_inj       3.099
64   non_inj       3.113
65   non_inj       3.216
66   non_inj       3.215
67   non_inj       3.246
68   non_inj       2.981
69   non_inj       3.158
70   non_inj       3.094
71   non_inj       3.224
72   non_inj       3.250
73   non_inj       3.124
74   non_inj       3.278
75   non_inj       2.850
76   non_inj       3.240
77   non_inj       3.259
78   non_inj       3.231
79   non_inj       3.227
80   non_inj       2.897
81   non_inj       2.886
82   non_inj       2.922
83   non_inj       3.357
84   non_inj       3.327
85   non_inj       2.894
86   non_inj       2.950
87   non_inj       3.327


Comme vous pouvez le constater, la fonction boxplot.stat me ressort bien des outlier ainsi que leurs index, mais cette ligne ci : DATA_WO=DATA[c(-outlier_inj_WT_idx)] ne fonctionne pas et mes outliers se retrouvent dans mon jeu de donnée ''DATA_WO''.

Il y a surement une erreur bête et méchante mais impossible de mettre le doigt dessus.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Supprimer des valeurs dans un tableau en fonction de leurs index

Messagepar Logez Maxime » 06 Oct 2023, 13:42

Bonjour,

Il te manque une virgule après la parenthèse :

Code : Tout sélectionner

DATA_WO=DATA[c(-outlier_inj_WT_idx), ]

D'ailleurs tu n'as pas besoin de c(-outlier...), tu peux directement mettre -outlier_inj_WT_idx.
Autre remarque en passant, il est souvent conseillé d'effectuer tes affectations avec une flèche plutôt qu'un égal :

Code : Tout sélectionner

DATA_WO <- DATA[-outlier_inj_WT_idx, ]

Cordialement,
Maxime

Facundo Muñoz
Messages : 156
Enregistré le : 04 Juil 2019, 09:58
Contact :

Re: Supprimer des valeurs dans un tableau en fonction de leurs index

Messagepar Facundo Muñoz » 06 Oct 2023, 13:47

Bonjour,

Dans la première page du forum, il y a un annonce "Qu'est-ce qu'un code reproductible" [1]. Il est là parce-que ça facilite énormement la communication et l'aide.

Basiquement, il s'agit de pouvoir copier votre code et réproduire votre problème, pour chercher une solution.

Dans votre cas, il me semble que le problème vient de la séléction de lignes.
Essayez comme ça :

Code : Tout sélectionner

DATA_WO <- DATA[-outlier_inj_WT_idx, ]


Cordialement,

[1] viewtopic.php?f=1&t=7638
ƒacu.-

Rigal Jules
Messages : 3
Enregistré le : 19 Avr 2023, 13:51

Re: Supprimer des valeurs dans un tableau en fonction de leurs index

Messagepar Rigal Jules » 09 Oct 2023, 09:36

Merci à vous !

Comme prévu tout ça pour une simple virgule haha.

Merci pour m'apprendre les codes de ce forum.

Bonne journée à vous.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron