[R] Replace zeroes in vector with nearest non-zero value

Murali.MENON at fortisinvestments.com Murali.MENON at fortisinvestments.com
Fri Jun 19 08:58:09 CEST 2009


Jim, Gabor, William,
Thanks very much. Works a treat.
Cheers,
Murali


-----Original Message-----
From: William Dunlap [mailto:wdunlap at tibco.com] 
Sent: 18 June 2009 18:27
To: MENON Murali; r-help at r-project.org
Subject: RE: [R] Replace zeroes in vector with nearest non-zero value

approx() almost does what you want, but you have to patch up its output
to account for a possible initial run of 0's in the
input:
> x <- c(0, -1, -1, -1, 0, 0, 1, -1, 1, 0) y <- 
> approx(seq_along(x)[x!=0], x[x!=0], xout=seq_along(x),
method="const", f=0, rule=2)$y
> y
 [1] -1 -1 -1 -1 -1 -1  1 -1  1  1

Doing tricks with cumsum will do it more directly:

f<-function(x){
     i<-cumsum(x!=0) # indices to last non-zero value in x
     c(x[i==0], x[x!=0][i]) # x[i==0] is initial run of 0's, x[x!=0][i]
gets the rest }
> rbind(x,f(x))
  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
x    0   -1   -1   -1    0    0    1   -1    1     0
     0   -1   -1   -1   -1   -1    1   -1    1     1

If there are NA's in x you will have to add an NA test to the x!=0 and
x==0 tests or replace the NA's by 0's before doing this.

Bill Dunlap
TIBCO Software Inc - Spotfire Division
wdunlap tibco.com  

> -----Original Message-----
> From: r-help-bounces at r-project.org
> [mailto:r-help-bounces at r-project.org] On Behalf Of 
> Murali.MENON at fortisinvestments.com
> Sent: Thursday, June 18, 2009 9:48 AM
> To: r-help at r-project.org
> Subject: [R] Replace zeroes in vector with nearest non-zero value
> 
> Folks,
>  
> If I have a vector such as the following:
>  
> x <- c(0, -1, -1, -1, 0, 0, 1, -1, 1, 0)
>  
> and I want to replace the zeroes by the nearest non-zero number to the

> left, is there a more elegant way to do this than the following loop?
>  
> y <- x
> for (i in 2 : length(x))
> {
>     if (y[i] == 0) {
>         y[i] <- y[i - 1]
>     }
> }
>  
> > y
> [1]  0 -1 -1 -1 -1 -1  1 -1  1  1
>  
> You can see the first zero is left as is, the next two zeroes become 
> -1, which is the closest non-zero to the left of them, and the last 
> zero becomes 1.
>  
> Cheers,
> Murali
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
> 




More information about the R-help mailing list