SUBSET: erreur d'exécution

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

ameni melki
Messages : 40
Enregistré le : 24 Fév 2021, 14:54

SUBSET: erreur d'exécution

Messagepar ameni melki » 21 Juil 2021, 11:40

Bonjour,

je fais des traitements d'exclusion sur ma base de données, j'utilise le code suivant pour tous les champs
par exemple:

Code : Tout sélectionner

data<-subset(data,   `nom fournisseurs`!="orange" &
                                         `nom fournisseurs`!="EDF" &
                                         `nom fournisseurs`!="télécoms")
                                         


Dans ma base, les fournisseurs "orange", "EDF" et "télécoms" ne sont pas présent, normalement quand j'applique le code rien ne change et aucune suppression n'est effectuée, mais en exécutant le code j'ai beaucoup d'observations supprimées.

Alors j'ai vérifié sur mon fichier Excel et j'ai remarqué que lorsque je filtre mes données et j'enlève les vides du champ "nom de fournisseurs" j'obtiens le même nombre d'observation que dans r après exécution du code.

Donc le code supprime tous les colonnes NA (vides).

j'ai essayé ce code aussi, il donne 0 observations

Code : Tout sélectionner

data2<- data[-which(data$`nom fournisseurs`!="orange" ) ,]
.

J'ai appliqué cette fonction sur d'autres champs et ça marche très bien, sauf sur 2 variables ou il supprime les vides.

Est ce que vous avez une idée pourquoi j'ai eu ce résultat Il y a un détail qui m'échappe.

Merci beaucoup

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: SUBSET: erreur d'exécution

Messagepar Mickael Canouil » 21 Juil 2021, 14:15

Bonjour,

faute de fournir un exemple reproductible minimal, ma réponse restera "théorique" ...

Les tests d'ensembles se font avec match ou l'opérateur %in% et non "==" ou "!=", une comparaison avec NA donnera toujours NA.

Code : Tout sélectionner

NA == c(1, NA, NaN, NULL)
#> [1] NA NA NA

NA %in% c(1, NA, NaN, NULL)
#> [1] TRUE    


Par exemple, voir les diapos 17-21: https://m.canouil.fr/radvanced/#17
Mickaël
mickael.canouil.fr | rlille.fr

ameni melki
Messages : 40
Enregistré le : 24 Fév 2021, 14:54

Re: SUBSET: erreur d'exécution

Messagepar ameni melki » 21 Juil 2021, 15:18

Merci pour votre retour.

faute de fournir un exemple reproductible minimal, ma réponse restera "théorique" ...


j'ai mis un exemple simplifié pour posé le problème car la requête sur laquelle je travaille est très compliquée et c'est difficile d'expliquer les variables et leurs modalités.

j'ai trouvé une solution à mon problème, en fait la fonction subset supprime aussi les champs vide (NA), je ne me suis pas persuadé car j'ai pas eu de NA dans les autres variables.

j'ai utilisé ce code pour remplacer les NA par "non renseigné"

Code : Tout sélectionner

data2 <- mutate_at(data, c("nom fournisseurs"), ~replace(., is.na(.), "non renseigné"))


Après j'ai appliqué le subset et ça marche très bien.

il y a surement une autre fonction qui permet de supprimer des valeurs toute en gardant les NA.

Merci beaucoup.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: SUBSET: erreur d'exécution

Messagepar Mickael Canouil » 22 Juil 2021, 08:05

Si vous ne prenez même pas la peine de lire et comprendre la réponse fournie dans son entièreté, à quoi bon poser la question ?
Vous n'avez pas compris le problème et au final vous voulez le contourner ...
En somme, vous allez continuer à reproduire consciemment et inconsciemment l'erreur, avec de ce fait des conséquences non négligeables.

Code : Tout sélectionner

set.seed(2207)
dta <- data.frame(
  
letters,
  
sample(1L:26L)
)
dta[sample(1:265), "x"] <- NA_character_
dta
[sample(1:265), "y"] <- NA_integer_

  • Caractère

    Code : Tout sélectionner

    subset(dta!= "a")
    #>    x  y
    #> 2  b NA
    #> 3  c 17
    #> 4  d 18
    #> 5  e 22
    #> 6  f  4
    #> 8  h 12
    #> 9  i NA
    #> 11 k NA
    #> 12 l 25
    #> 13 m NA
    #> 14 n NA
    #> 18 r  2
    #> 19 s 10
    #> 20 t  1
    #> 21 u 16
    #> 22 v 15
    #> 23 w 23
    #> 24 x 24
    #> 25 y  9
    #> 26 z 21
    subset(dta, !%in"a")
    #>       x  y
    #> 2     b NA
    #> 3     c 17
    #> 4     d 18
    #> 5     e 22
    #> 6     f  4
    #> 7  <NA> 11
    #> 8     h 12
    #> 9     i NA
    #> 10 <NA> 14
    #> 11    k NA
    #> 12    l 25
    #> 13    m NA
    #> 14    n NA
    #> 15 <NA> 19
    #> 16 <NA>  5
    #> 17 <NA>  3
    #> 18    r  2
    #> 19    s 10
    #> 20    t  1
    #> 21    u 16
    #> 22    v 15
    #> 23    w 23
    #> 24    x 24
    #> 25    y  9
    #> 26    z 21 
  • Entier

    Code : Tout sélectionner

    subset(dta!= 17L)
    #>       x  y
    #> 1     a  6
    #> 4     d 18
    #> 5     e 22
    #> 6     f  4
    #> 7  <NA> 11
    #> 8     h 12
    #> 10 <NA> 14
    #> 12    l 25
    #> 15 <NA> 19
    #> 16 <NA>  5
    #> 17 <NA>  3
    #> 18    r  2
    #> 19    s 10
    #> 20    t  1
    #> 21    u 16
    #> 22    v 15
    #> 23    w 23
    #> 24    x 24
    #> 25    y  9
    #> 26    z 21
    subset(dta, !%in17L)
    #>       x  y
    #> 1     a  6
    #> 2     b NA
    #> 4     d 18
    #> 5     e 22
    #> 6     f  4
    #> 7  <NA> 11
    #> 8     h 12
    #> 9     i NA
    #> 10 <NA> 14
    #> 11    k NA
    #> 12    l 25
    #> 13    m NA
    #> 14    n NA
    #> 15 <NA> 19
    #> 16 <NA>  5
    #> 17 <NA>  3
    #> 18    r  2
    #> 19    s 10
    #> 20    t  1
    #> 21    u 16
    #> 22    v 15
    #> 23    w 23
    #> 24    x 24
    #> 25    y  9
    #> 26    z 21 
  • Caractère & Entier

    Code : Tout sélectionner

    subset(dta!= 17L != "a")
    #>    x  y
    #> 4  d 18
    #> 5  e 22
    #> 6  f  4
    #> 8  h 12
    #> 12 l 25
    #> 18 r  2
    #> 19 s 10
    #> 20 t  1
    #> 21 u 16
    #> 22 v 15
    #> 23 w 23
    #> 24 x 24
    #> 25 y  9
    #> 26 z 21
    subset(dta, !%in17L & !%in"a")
    #>       x  y
    #> 2     b NA
    #> 4     d 18
    #> 5     e 22
    #> 6     f  4
    #> 7  <NA> 11
    #> 8     h 12
    #> 9     i NA
    #> 10 <NA> 14
    #> 11    k NA
    #> 12    l 25
    #> 13    m NA
    #> 14    n NA
    #> 15 <NA> 19
    #> 16 <NA>  5
    #> 17 <NA>  3
    #> 18    r  2
    #> 19    s 10
    #> 20    t  1
    #> 21    u 16
    #> 22    v 15
    #> 23    w 23
    #> 24    x 24
    #> 25    y  9
    #> 26    z 21 
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

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