web-dev-qa-db-fra.com

Remplacer la valeur donnée dans le vecteur

Je recherche une fonction qui remplacera toutes les occurrences d'une valeur par une autre valeur . Par exemple, j'aimerais remplacer tous les zéros par des ..... Je ne veux pas avoir à stocker le résultat dans une variable, mais veulent pouvoir utiliser le vecteur de manière anonyme dans le cadre d’une expression plus large.

Je sais écrire moi-même une fonction appropriée:

> vrepl <- function(haystack, needle, replacement) {
+   haystack[haystack == needle] <- replacement
+   return(haystack)
+ }
> 
> vrepl(c(3, 2, 1, 0, 4, 0), 0, 1)
[1] 3 2 1 1 4 1

Mais je me demande s’il existe une fonction standard pour effectuer ce travail, de préférence du paquet base, au lieu d’un autre paquet couramment utilisé. Je pense que l'utilisation d'une telle norme rendra mon code plus lisible et je n'aurai pas à redéfinir cette fonction là où j'en aurai besoin.

22
MvG

replace est peut-être ce que vous recherchez:

> x = c(3, 2, 1, 0, 4, 0)
> replace(x, x==0, 1)
[1] 3 2 1 1 4 1

Ou, si vous n'avez pas x (une raison spécifique pourquoi pas?):

replace(c(3, 2, 1, 0, 4, 0), c(3, 2, 1, 0, 4, 0)==0, 1)

gsub étant connu de nombreuses personnes, vous pouvez également essayer l'une des solutions suivantes:

as.numeric(gsub(0, 1, x))
as.numeric(gsub(0, 1, c(3, 2, 1, 0, 4, 0)))

Mettre à jour

Après avoir lu les commentaires, with est peut-être une option:

with(data.frame(x = c(3, 2, 1, 0, 4, 0)), replace(x, x == 0, 1))
47

Une autre option plus simple est de faire:

 > x = c(1, 1, 2, 4, 5, 2, 1, 3, 2)
 > x[x==1] <- 0
 > x
 [1] 0 0 2 4 5 2 0 3 2
12
nico

Pour remplacer plusieurs numéros:

vec <- 1:10
replace(vec, vec== c(2,6), c(0,9)) #2 and 6 will be replaced by 0 and 9.

Modifier:

pour une série continue, vous pouvez faire ceci vec <- c(1:10); replace(vec, vec %in% c(2,6), c(0,9)) mais pour vec <- c(1:10,2,2,2); replace(vec, vec %in% c(2,6), 0), nous pouvons remplacer plusieurs valeurs par une seule.

5
TheMI

Pour les vecteurs factor ou character , nous pouvons utiliser revalue à partir de plyr:

> revalue(c("a", "b", "c"), c("b" = "B"))
[1] "a" "B" "c"

Cela a l’avantage de ne spécifier le vecteur d’entrée qu’une seule fois. Nous pouvons donc utiliser un tuyau comme 

x %>% revalue(c("b" = "B"))
2
qwr

La fonction ifelse serait un moyen rapide et facile de le faire.

1
Greg Snow

Pourquoi le bruit?

replace(haystack, haystack %in% needles, replacements)

Démo:

haystack <- c("q", "w", "e", "r", "t", "y")
needles <- c("q", "w")
replacements <- c("a", "z")

replace(haystack, haystack %in% needles, replacements)
#> [1] "a" "z" "e" "r" "t" "y"
0
MS Berends