[Débutante] Supprimer des observations conditionnellement à une valeur

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

Maylis Fontaine
Messages : 7
Enregistré le : 05 Jan 2017, 15:41

[Débutante] Supprimer des observations conditionnellement à une valeur

Messagepar Maylis Fontaine » 05 Jan 2017, 16:07

Bonjour,

Recevez tout d'abord mes meilleurs voeux pour cette année 2017!

Je suis étudiante en Master 2 de Psychologie et je découvre cette année seulement le logiciel R, dont l'apprentissage demande beaucoup de temps et d'efforts. Il me semble toutefois qu'il offre plus de possibilités que le logiciel sur lequel j'ai été formée, SPSS pour ne pas le citer. C'est pourquoi je m'entête, mais j'ai vraiment beaucoup de difficultés...

Ce qui m'amène à poster ici, c'est que je bloque complètement avec le traitement des valeurs manquantes de mon fichier de données, qui ont été codées "-1", malgré des heures à chercher dans les forums et tutos disponibles sur le net...

J'ai tenté plusieurs choses pour supprimer les lignes contenant des valeurs -1 dans 21 de mes 31 colonnes mais rien ne fonctionne...

J'ai d'abord tenté de remplacer les -1 par NA avec "replace(Donnees_NA,Donnees_NA==-1,NA)" pour ensuite pouvoir utiliser na.omitt mais ça ne fonctionne pas...

J'ai alors tenté de repérer les -1 par colonne avec, pour la première colonne "which(Donnees_NA$Q1 ==-1)" puis de supprimer manuellement chaque ligne indiquée en commençant par la plus basse : "DonneesR <- Donnees_NA [-811,]
DonneesR <- DonneesR [-477,]
DonneesR <- DonneesR [-277,]"
J'ai fait cela pour chaque colonne de Q1 à Q21, soit plus de 200 observations à supprimer. Au final, non seulement ça m'a pris un temps fou, mais en plus quand j'ai voulu vérifier qu'il n'y avait plus de -1 dans le jeu de données avec "which(DonneesR ==-1)", il y en avait encore plus d'une centaine... Je ne comprends pas....

Pouvez-vous m'aider?

Un grand merci d'avance!!

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

Re: [Débutante] Supprimer des observations conditionnellement à une valeur

Messagepar Mickael Canouil » 05 Jan 2017, 16:44

Bonjour,

voici une proposition assez "simple"
1) Soit dta une matrice pour jouer:

Code : Tout sélectionner

dta <- structure(c(-1, -1, 1, -1, -1, -1, -1, 0, -1, 0, 1, 0, 1, 0, -1, -1, -1, -1, -1, 1, 0, -1, 0, 0, 0), .Dim = c(5L, 5L))
dta
     [,1] [,2] [,3] [,4] [,5]
[1,]   -1   -1    1   -1    0
[2,]   -1   -1    0   -1   -1
[3,]    1    0    1   -1    0
[4,]   -1   -1    0   -1    0
[5,]   -1    0   -1    1    0


2) Une solution, on compare toutes les valeurs de la matrices pour savoir si elles valent -1, puis on récupère le résultat pour s'en servir d'indice, et remplacer dans la matrice d'origine les valeurs par NA.

Code : Tout sélectionner

dta[dta==-1] <- NA


Si vous utilisez read.table pour importer vos données, vous pouvez effectuer ce traitement directement avec l'argument "na.strings = -1"

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Maylis Fontaine
Messages : 7
Enregistré le : 05 Jan 2017, 15:41

Re: [Débutante] Supprimer des observations conditionnellement à une valeur

Messagepar Maylis Fontaine » 05 Jan 2017, 17:38

Bonsoir,

Et la lumière fut!! Un immense merci à vous! Avec l'argument "na.strings = -1" dans read.table c'est parfait.

Cordialement,
Maylis

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: [Débutante] Supprimer des observations conditionnellement à une valeur

Messagepar Jean-Emmanuel Longueville » 09 Jan 2017, 13:12

Si je vous suis bien vous souhaiter supprimer toute la ligne et non juste les valeurs -1
votre solution initiale avec which est une bonne solution et il faut la combiné avec le moins avec un code ressemblant à ca :

Code : Tout sélectionner

toto[-which(toto$Q1 == -1),]
Jean-Emmanuel
Ingénieur d'étude LNEC

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

Re: [Débutante] Supprimer des observations conditionnellement à une valeur

Messagepar Logez Maxime » 09 Jan 2017, 13:48

Bonjour,

une remarque au passage sur l'utilisation de la fonction which. Il n'est pas nécessaire, on peut faire la même chose directement avec un booléen, ou se passer de la négation devant :

Code : Tout sélectionner

toto[toto$Q1!=-1,]
#ou
toto[which(toto$Q1!=-1),]
Si tu ne veux conserver que les lignes pour lesquelles il n'y a aucun NA, tu importes tes données en générant des NA avec na.strings et tu peux utiliser la fonction complete.cases :

Code : Tout sélectionner

toto[complete.cases(toto),]
Seules les lignes sans aucun NA seront conservées.
Cordialement,
Maxime

Maylis Fontaine
Messages : 7
Enregistré le : 05 Jan 2017, 15:41

Re: [Débutante] Supprimer des observations conditionnellement à une valeur

Messagepar Maylis Fontaine » 04 Fév 2017, 21:48

Bonsoir,

Merci à vous deux pour ces compléments. Par contre je ne saisis pas ce qu'est un booléen...

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

Re: [Débutante] Supprimer des observations conditionnellement à une valeur

Messagepar Logez Maxime » 06 Fév 2017, 09:39

Bonjour,

[quote=Wikipedia]Un booléen, en logique et en programmation informatique, est un type de variable à deux états. Les variables de ce type sont ainsi soit à l'état vrai soit à l'état faux (en anglais, true et false).

Généralement, les conditions sont de type booléen, car elles nécessitent une réponse binaire du type oui ou non.[/quote]Quand tu établis la comparaison toto$Q1!=-1 pour chaque valeur de tot$Q1 tu cherches à savoir si elle est vraie (TRUE) ou fausse (FALSE). Si tu ne fais afficher que le résultat de cette expression tu auras un vecteur (une suite de valeur) composé uniquement de valeur en TRUE et FALSE, un booléen.

Cordialement,
Maxime

Maylis Fontaine
Messages : 7
Enregistré le : 05 Jan 2017, 15:41

Re: [Débutante] Supprimer des observations conditionnellement à une valeur

Messagepar Maylis Fontaine » 25 Fév 2017, 21:43

Bonsoir,

Merci bien pour cette explication.
La route va encore être longue avant de maîtriser ce langage et cette logique utilisés dans R...

Cordialement,
Maylis


Retourner vers « Questions en cours »

Qui est en ligne

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