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.
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)))
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))
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
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.
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"))
La fonction ifelse
serait un moyen rapide et facile de le faire.
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"