[R] Help on a code

William Dunlap wdunlap at tibco.com
Tue Feb 26 23:02:28 CET 2013


f <- function(x, y, criticalY) {
   # return x value of first upcrossing of y past criticalY
   stopifnot(length(x) == length(y), length(x)>1, length(criticalY)==1)
   i <- seq_along(x)[-1]
   w <- which(y[i] >= criticalY & y[i-1] <= criticalY)[1] # pos of first upcrossing
   if (is.na(w)) { # no upcrossing
       NA
   } else {
       denom <- y[w+1] - y[w]
       if (denom == 0) { # take left side of flat spot
           x[w]
        } else { # the nice case
           x[w] + (x[w+1] - x[w]) / denom * (criticalY - y[w])
        }
    }
}

> f(x=c(1,2,3,4,5), y=c(0, 1.5, 3, 1, 4), criticalY=2)
[1] 2.333333
> f(x=c(1,2,3,4,5), y=c(0, 1.5, 3, 1, 4), criticalY=100)
[1] NA

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com


> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
> Of Andras Farkas
> Sent: Tuesday, February 26, 2013 1:21 PM
> To: r-help at r-project.org
> Subject: [R] Help on a code
> 
> Dear List,
> 
> I have the following code:
> 
> x <-c(0, 13.8333333333333, 38.1666666666667, 62.1666666666667, 85.9166666666667,
> 108.916666666667)
> y <-c(1.77, 2.39, 3, 2.65, 2.62, 1.8)
> Interpolated <- approx(x, y,xout=0:tail(x, n=1),method="linear")
> plot(Interpolated)
> 
> in this code x is time in hours (cumulative), and y is a biological variable. I am using linear
> interpolation assuming getting from y(i) to y(i+1) is a linear path. I would like to calculate
> the time in this case that it takes to surpass the y value of 2 for the first time. If you look
> at the plot, you will see that the y value of 2 is crossed on 2 occasions: between the first
> and second value of y (ie:1.77 to 2.39) and the fifth and sixth value of y (ie2.62 and 1.8).
> In my case I really only care about the first "section" (ie: how long it takes to get from
> 1.77 to 2.0). Any thoughts on how I could calculate that chunk of the time would be
> greatly appreciated.
> 
> let me present it in a simpler idea wher I can actually tell you what the answer should be
> without having the code:
> 
> x <-c(0, 12, 24, 36, 48, 60)
> y <-c(1.5, 2, 3, 2.65, 2.62, 1.8)
> Interpolated <- approx(x, y,xout=0:tail(x, n=1),method="linear")
> plot(Interpolated)
> 
> the answer in this case is 12 hours, which is the time spent in getting from 1.5 to 2...
> 
> hope I explained clearly what I am trying to do
> 
> appreciate the help,
> 
> Andras
> 
> 	[[alternative HTML version deleted]]



More information about the R-help mailing list