suppression NA

Questions sur les objets de R et la manipulation des données

Modérateur : Groupe des modérateurs

Sébastien Hamel
Messages : 71
Enregistré le : 11 Mai 2006, 08:00

suppression NA

Messagepar Sébastien Hamel » 28 Juin 2006, 12:39

Dans un vecteur qcq x par exemple, j'ai des valeurs numeriques & des NA.

Comment faire pour préserver les valeurs numériques & supprimer tous les NA??

Merci

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Messagepar François Bonnot » 28 Juin 2006, 12:44

Code : Tout sélectionner

x[!is.na(x)]

Pierre Bady
Messages : 405
Enregistré le : 02 Mai 2006, 07:46

Messagepar Pierre Bady » 28 Juin 2006, 12:59

bonjour,

voici un exemple qui devrait répondre à tes attentes:

Code : Tout sélectionner

# on prépare notre vecteur pour l'exemple
> vec <- rnorm(12)
> vec[c(2,5,6)] <- rep(NA,3)
> vec
 [1] -0.38055       NA -2.84658 -0.55528       NA       NA  0.45146 -0.18322
 [9] -0.49962  2.45838  0.05215 -0.39455
# première proposition :
# on utilise 'is.na'
> vec[!is.na(vec)]
[1] -0.38055 -2.84658 -0.55528  0.45146 -0.18322 -0.49962  2.45838  0.05215
[9] -0.39455
# seconde proposition:
# on localiser les valeurs égale à NA avec 'which' et 'is.na'
> which(is.na(vec))
[1] 2 5 6
> vec[-which(is.na(vec))]
[1]  1.7321  1.0738  1.3466 -0.1239 -0.5337 -0.6548  0.9852  1.1466  0.2191
# troisième proposition:
# la fonction qui fait tout (sauf le café et la vaisselle) :
> na.omit(vec)
[1]  1.7321  1.0738  1.3466 -0.1239 -0.5337 -0.6548  0.9852  1.1466  0.2191
attr(,"na.action")
[1] 2 5 6
attr(,"class")
[1] "omit"
# quatrième proposition:
>  ?NA


@+

Pierre

Pierre Bady
Messages : 405
Enregistré le : 02 Mai 2006, 07:46

Messagepar Pierre Bady » 28 Juin 2006, 13:03

re ...

arrfff ... je ne suis pas assez rapide :)

@+

Pierre

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 30 Juil 2008, 10:24

Je réactive ce vieux sujet pour signaler une bizzarrerie:

Code : Tout sélectionner

> matricetest
  V V2 V3 V4  V5
1 A  5  8  9 0.1
2 B  4  7 10 0.5
3 A  5  8 10 0.3
4 B  5  7 10 0.4
5 A  4  7  9 0.0
> matricetest[-which(is.na(matricetest))]
NULL data frame with 5 rows
> matricetest[1,1]  <- NA
> matricetest
     V V2 V3 V4  V5
1 <NA>  5  8  9 0.1
2    B  4  7 10 0.5
3    A  5  8 10 0.3
4    B  5  7 10 0.4
5    A  4  7  9 0.0
> matricetest[-which(is.na(matricetest))]
  V2 V3 V4  V5
1  5  8  9 0.1
2  4  7 10 0.5
3  5  8 10 0.3
4  5  7 10 0.4
5  4  7  9 0.0


C'est à dire que quand il n'y a aucun NA, tout est supprimé, alors qu'il faudrait au contraire tout laisser.

Idem pour d'autres choses que NA:

Code : Tout sélectionner

> vect8 <- which(matricetest[,3] == 8)
> vect8
[1] 1 3
> matricetest[-vect8,]
  V V2 V3 V4  V5
2 B  4  7 10 0.5
4 B  5  7 10 0.4
5 A  4  7  9 0.0


Jusque là, aucun problème.
Et dans le cas suivant:

Code : Tout sélectionner

> vect9 <- which(matricetest[,3] == 9)
> vect9
integer(0)
> matricetest[-vect9,]
[1] V  V2 V3 V4 V5
<0 rows> (or 0-length row.names)


Tout est supprimé une fois de plus.

Certes, dans un programme on peut se débrouiller avec un if:

Code : Tout sélectionner

if (length(vect9)>0){
matricetest <- matricetest[-vect9,]
}


Mais je trouve quand même tout cela assez étrange. Non?

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

Messagepar Logez Maxime » 30 Juil 2008, 13:52

Bonjour,

Il ne semble pas très opportun de modifier des topics archivés. Peut-être aurais-tu du ouvrir un nouveau topic.

Aucune bizarrerie la dedans tout est lier au fonctionnement des indexations. Peut-être faudrait-il lire quelques documents sur le fonctionnement de R.

Dans le cas des NA, sans NA, which(is.na(matricetest)) renvoie un vecteur NULL, et quand le NULL est impliqué dans une indexation alors R ne renvoie rien, ce qui est normal puisqu'on lui demande de ne rien renvoyer. De part la syntaxe utilisée ici pour virer les NA il n'est pas pertinent de l'appliquer quand il n'y a pas de NA dans le tableau. En plus ici ce n'est pas l'indexation adéquate pour un data.frame qui est utilisé.
Pour virer les lignes avec des NA dans un tableau voir du côté de complete.cases.

Tu peux aussi te débrouiller avec un apply :

Code : Tout sélectionner

x
  V V2 V3 V4  V5
1 A  5  8  9 0.1
2 B  4  7 10 0.5
3 A  5  8 10 0.3
4 B  5  7 10 0.4
5 A  4  7  9 0.0

x[apply(x,1,function(x) !any(is.na(x))),]
  V V2 V3 V4  V5
1 A  5  8  9 0.1
2 B  4  7 10 0.5
3 A  5  8 10 0.3
4 B  5  7 10 0.4
5 A  4  7  9 0.0


Maxime

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 30 Juil 2008, 14:18

Logez Maxime a écrit :Bonjour,

Il ne semble pas très opportun de modifier des topics archivés. Peut-être aurais-tu du ouvrir un nouveau topic.


C'est vrai. Je plaide pour ma défense que ma remarque me paraissait fortement liée avec le topic. Mais je ne recommencerai pas.

De part la syntaxe utilisée ici pour virer les NA il n'est pas pertinent de l'appliquer quand il n'y a pas de NA dans le tableau.


Encore faut-il le savoir; je m'explique: vous pouvez partir d'une grosse matrice avec des NA, et ensuite prendre un échantillon. D'où il y a un test à faire.


Merci pour les explications et l'astuce avec apply.

GC [Compte désactivé]

Messagepar GC [Compte désactivé] » 04 Mai 2010, 22:58

bonjour, je souhaiterais faire la meme chose, mais cette fois dans un data frame

Code : Tout sélectionner

    Temp Ozone
1     67    41
2     72    36
3     74    12
4     62    18
5     56    NA
6     66    28
7     65    23
8     59    19
9     61     8
...
150   77    NA
151   75    14
152   76    18
153   68    20


je souhaiterais supprimer les lignes comportant des valeurs NA
j'ai tenté avec une boucle , mais ca me renvoie une erreur

Code : Tout sélectionner

for(i in 1:153) {(is.na.data.frame(A[i,]))==TRUE) A[-i,]}
Erreur : symbole inattendu(e) dans "for(i in 1:153) {(is.na.data.frame(A[i,])==TRUE) A"

avec

Code : Tout sélectionner

A=data.frame(Temp,Ozone)

que dois-je faire?
merci

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Messagepar Serge Rapenne » 05 Mai 2010, 07:02

Bonjour,

ta boucle ne peut pas fonctionner car le nb d'élément de ton data.frame diminue au fur et à mesure que tu supprimes des éléments. Pour supprimer de valeurs NA :

Code : Tout sélectionner

?na.omit


Serge

ILHEM KASSOUS
Messages : 0
Enregistré le : 23 Jan 2017, 12:49

Re: suppression NA

Messagepar ILHEM KASSOUS » 27 Jan 2017, 14:14

Bonjour,
je voudrais calculer la moyenne du cuivre dans mon échantillon, apres avoir importer mon fichier avec read.csv
data=read.csv("L2266_Barf_profil.csv", h=T)
head(data)
na.omit(data)
mean(data$cuivre)
Warning message:
In mean.default(A) :
L'argument est ni numérique ni booléen: NA redonner


2eme question:
dans mon fichier.csv j´ai des valeurs avec le caracteres ">", je voulais les supprimer, mais je ne sais pas comment?
Merci de votre aide
bonne journée


Retourner vers « Archives : Manipulation de données avec R »

Qui est en ligne

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