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-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On > Behalf > Of Andras Farkas > Sent: Tuesday, February 26, 2013 1:21 PM > To: r-help@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]] ______________________________________________ R-help@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.