Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replace given value in vector

Tags:

replace

r

I'm looking for a function which will replace all occurrences of one value with another value. For example I'd like to replace all zeros with ones. I don't want to have to store the result in a variable, but want to be able to use the vector anonymously as part of a larger expression.

I know how to write a suitable function myself:

> 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 

But I'm wondering whether there is some standard function to do this job, preferrably from the base package, as an alternative from some other commonly used package. I believe that using such a standard will likely make my code more readable, and I won't have to redefine that function wherever I need it.

like image 865
MvG Avatar asked Jul 31 '12 09:07

MvG


2 Answers

Perhaps replace is what you are looking for:

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

Or, if you don't have x (any specific reason why not?):

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

Many people are familiar with gsub, so you can also try either of the following:

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

Update

After reading the comments, perhaps with is an option:

with(data.frame(x = c(3, 2, 1, 0, 4, 0)), replace(x, x == 0, 1)) 
like image 176
A5C1D2H2I1M1N2O1R2T1 Avatar answered Sep 29 '22 07:09

A5C1D2H2I1M1N2O1R2T1


Another simpler option is to do:

 > 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 
like image 42
nico Avatar answered Sep 29 '22 08:09

nico