[Débutant] Fonction replace pour matrice

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

Modérateur : Groupe des modérateurs

Vincent BONNAL
Messages : 12
Enregistré le : 17 Déc 2004, 10:07
Contact :

[Débutant] Fonction replace pour matrice

Messagepar Vincent BONNAL » 07 Jan 2005, 12:29

Salut,

Je ne sais pas vraiment si ce forum a été conçu pour celà, mais en tant que newbie sur R (et ciradien), je me pose une question de base:

Code : Tout sélectionner

toto
     [,1]
[1,]    1
[2,]   NA
[3,]    0
[4,]    5
> replace(toto,0,NA)
     [,1]
[1,]    1
[2,]   NA
[3,]    0
[4,]    5


Vous l'avez compris, je souhaite remplacer 0 par NA, mais la fonction replace ne s'adresse qu'aux vecteurs et non aux matrices.... Y'a t'il l'équivalent pour les matrices???

Merci :wink:
Vincent BONNAL
CIRAD Bios - UPR 59 Ecotrop

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

Messagepar François Bonnot » 07 Jan 2005, 12:59

Ce forum est destiné à tous les utilisateurs de R, débutants ou non.
Cette question y est donc parfaitement à sa place.

Syntaxe: replace(x, list, values)
list doit contenir les indices (sous forme numérique ou logique) des éléments à remplacer
Ex:

Code : Tout sélectionner

> toto
     [,1]
[1,]    1
[2,]   NA
[3,]    0
[4,]    5
> replace(toto,c(1,3),c(100,300))
     [,1]
[1,]  100
[2,]   NA
[3,]  300
[4,]    5

Donc une solution est (il y en a d'autres)

Code : Tout sélectionner

> replace(toto,is.na(toto),0)
     [,1]
[1,]    1
[2,]    0
[3,]    0
[4,]    5


(pour voir comment ça marche essayer is.na(toto) )

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

Messagepar François Bonnot » 07 Jan 2005, 13:02

Pardon il s'agissait de remplacer les 0 par NA, donc

Code : Tout sélectionner

> replace(toto,toto==0,NA)
     [,1]
[1,]    1
[2,]   NA
[3,]   NA
[4,]    5

Matthieu Lesnoff
Messages : 120
Enregistré le : 29 Nov 2004, 12:41

Re: [Débutant] Fonction replace pour matrice

Messagepar Matthieu Lesnoff » 10 Jan 2005, 06:36

Vincent BONNAL a écrit :Salut,

Vous l'avez compris, je souhaite remplacer 0 par NA, mais la fonction replace ne s'adresse qu'aux vecteurs et non aux matrices.... Y'a t'il l'équivalent pour les matrices???

Merci :wink:


Une solution tres simple est d'utiliser la fonction which :

> x <- matrix(c(0, 5, NA, NA, 10, 0), nrow = 2)
> x
[,1] [,2] [,3]
[1,] 0 NA 10
[2,] 5 NA 0

> x[which(x == 0)] <- NA
> x
[,1] [,2] [,3]
[1,] NA NA 10
[2,] 5 NA NA

> is.matrix(x)
[1] TRUE


Matthieu

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

Messagepar François Bonnot » 10 Jan 2005, 13:18

Matthieu
Pourquoi which puisque x[x==0] <- NA est une syntaxe correcte?

Matthieu Lesnoff
Messages : 120
Enregistré le : 29 Nov 2004, 12:41

which

Messagepar Matthieu Lesnoff » 10 Jan 2005, 14:03

François Bonnot a écrit :Matthieu
Pourquoi which puisque x[x==0] <- NA est une syntaxe correcte?


Ouaip, "which" est effectivement inutile, x[x==0] est encore +compact.
Matthieu

Vincent BONNAL
Messages : 12
Enregistré le : 17 Déc 2004, 10:07
Contact :

Messagepar Vincent BONNAL » 11 Jan 2005, 10:28

Merci pour ces conseils (j'suis content parce que j'avais trouvé -finalement- seul la commande x[x==0] <- NA )
Vincent BONNAL

CIRAD Bios - UPR 59 Ecotrop

Vincent BONNAL
Messages : 12
Enregistré le : 17 Déc 2004, 10:07
Contact :

Messagepar Vincent BONNAL » 22 Sep 2005, 07:48

Bonjour,
Le dégel estival a eu lieu, me revoici... :lol: Petit rappel, je suis un débutant Riste permanent...

J'ai une nouvelle petite question, toujours sur la fonction replace
Voici le script me posant souci ainsi qu'une partie de solution:

Code : Tout sélectionner

> ValObs <- read.table("D:/MonFichier.txt",dec=',')
> ValObs
   V1         V2      V3      V4
1 618 08/08/1996   83.95   60.03
2 618 16/08/1996  389.51  270.06
3 618 22/08/1996 1612.04  979.01

> ValObs[,-(1:2)]
> as.matrix(ValObs)
       V3      V4
1   83.95   60.03
2  389.51  270.06
3 1612.04  979.01

> y<-replace(ValObs,ValObs==0,NA)
Error in "[<-.data.frame"(`*tmp*`, list, value = NA) :
        rhs is the wrong length for indexing by a logical matrix

> ValObs[2,2]<-0

> ValObs
       V3      V4
1   83.95   60.03
2  389.51    0.00
3 1612.04  979.01

> y<-replace(ValObs,ValObs==0,NA)

> y
       V3      V4
1   83.95   60.03
2  389.51      NA
3 1612.04  979.01

Donc, j'ai un message d'erreur lorsque j'essaye de remplace 0 par NA lorsqu'il n'y a pas de valeur 0... ben de temps en temps, ça arrive pour mes données et mon script part en choucroute.... Bien que dans ce cas ma fonction replace devient inutile, n'y a-t'il pas un moyen élégant d'éviter ce message d'erreur comme par exemple:

Code : Tout sélectionner

if (any(ValObs == 0)) y<-replace(ValObs,ValObs==0,NA)
mais en mieux...
Vincent BONNAL

CIRAD Bios - UPR 59 Ecotrop

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

Messagepar François Bonnot » 23 Sep 2005, 12:33

C'est parce-que ValObs est (resté) un data frame. La syntaxe suivante fonctionne

Code : Tout sélectionner

y<-replace(as.matrix(ValObs),ValObs==0,NA)

mais le plus simple est encore (voir messages précédents)

Code : Tout sélectionner

y <- as.matrix(ValObs)
y[y==0] <- NA

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 28 Sep 2005, 14:15

En fait, une matrice est un vecteur avec un attribut "dim". Cela explique qu'on peut indexer une matrice comme un vecteur

Code : Tout sélectionner

> x <- rnorm(12)
> x
 [1]  0.21626498 -0.37516901 -1.47338052 -0.70386730  0.07895953
 [6]  1.05037010 -1.02986689 -0.84141765 -0.97047061  2.19970685
[11] -0.49450489  1.37606969
> dim(x)
NULL
> attr(x,"dim") <- c(4, 3)
> x
           [,1]        [,2]       [,3]
[1,]  0.2162650  0.07895953 -0.9704706
[2,] -0.3751690  1.05037010  2.1997069
[3,] -1.4733805 -1.02986689 -0.4945049
[4,] -0.7038673 -0.84141765  1.3760697
> dim(x)
[1] 4 3
>
> x[x < 0] <- NA
> x
          [,1]       [,2]     [,3]
[1,] 0.2162650 0.07895953       NA
[2,]        NA 1.05037010 2.199707
[3,]        NA         NA       NA
[4,]        NA         NA 1.376070



De même, un data.frame est en fait une liste. Une fonction "naturelle" permettant de travailler sur les composantes d'une liste (= colonnes d'un data.frame) est lapply:

Code : Tout sélectionner

> dfx <- as.data.frame(x)
> dfx
         V1         V2       V3
1 0.2162650 0.07895953       NA
2        NA 1.05037010 2.199707
3        NA         NA       NA
4        NA         NA 1.376070
> y <- lapply(dfx, function(x) ifelse(is.na(x), 0, x))
> as.data.frame(y)
         V1         V2       V3
1 0.2162650 0.07895953 0.000000
2 0.0000000 1.05037010 2.199707
3 0.0000000 0.00000000 0.000000
4 0.0000000 0.00000000 1.376070


Amicalement,

Renaud

LA haumont
Messages : 41
Enregistré le : 16 Mai 2006, 09:33

Messagepar LA haumont » 07 Juil 2006, 09:58

j'utilise la fonction replace et n'obtins aucune erreur mais pourtant les caractères que je souhaite voir remplacer restent tel quel!

une idée?

merci

antoine rivierre
Messages : 5
Enregistré le : 12 Juin 2009, 20:35

pareil

Messagepar antoine rivierre » 06 Aoû 2009, 18:40

J'ai un probleme avec ma fonction replace.
J'ai une matrice avec une colonne "annee" malheureusement lors de la saisie, les annee 2000 à 2006 ont été écrite 0 à 6. De même les annee 19xx sont seulement rentrées sous le format xx.
Comme mes années sont des facteurs je les ai transformer en character et j'Ai utilisé la fonction suivante:
annee=replace(group1$annee, c( "0", "1", "2", "3", "4", "5", "6", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99"), c("2000", "2001", "2002", "2003", "2004", "2005", "2006", "1985", "1986", "1987", "1988", "1989", "1990", "1991", "1992", "1993", "1994", "1995", "1996", "1997", "1998", "1999"))

Pas de message d'erreur mais rien ne se passe...

Merci pour votre aide
Antoine Rivierre

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

Messagepar Serge Rapenne » 06 Aoû 2009, 23:12

Bonjour,

je ne connais pas la fonction replace mais le code suivant doit faire ce que tu veux

Code : Tout sélectionner

group1$annee<-ifelse(group1$annee>=10,paste("19",group1$annee,sep=""),paste("200",group1$annee,sep=""))


Serge


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

Qui est en ligne

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