You may want to append -Inf (or 0 if you know the data cannot be negative) to the start of your 'values' vector so you don't have to write code to catch the cases when a threshold is below the range of the values. > findInterval(thresholds, c(0,values,Inf)) [1] 1 5 5 5 8 > c(0, values, Inf)[.Last.value] [1] 0.000 1.874 1.874 1.874 7.722
Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com > -----Original Message----- > From: Zhang Weiwu [mailto:zhangwe...@realss.com] > Sent: Friday, September 13, 2013 8:52 AM > To: William Dunlap; smartpink...@yahoo.com > Cc: r-help@r-project.org > Subject: RE: [R] how to get values within a threshold > > > > On Fri, 13 Sep 2013, William Dunlap wrote: > > >> findInterval(thresholds, values) > > [1] 1 4 4 4 7 > > Thanks a lot! But now I have a new problem, a typical R issue perhaps. > > First, let's look at a successful case: > > > thresholds <- c(1,3,5,7,9) > > values <- c(0.854, 1.648, 1.829, 1.874, 7.670, 7.673, 7.722) > > values[findInterval(thresholds, values)] > [1] 0.854 1.874 1.874 1.874 7.722 > > Then a new batch of values came, notice only the first element of new values > differ: > > > thresholds <- c(1,3,5,7,9) > > values <- c(1.254, 1.648, 1.829, 1.874, 7.670, 7.673, 7.722) > > findInterval(thresholds, values) > [1] 0 4 4 4 7 > > values[findInterval(thresholds, values)] > [1] 1.874 1.874 1.874 7.722 > > This is a surprise. The desirable output is: > > [1] 0 1.874 1.874 1.874 7.722 > > This is desirable, because so maintains the same number of elements during > calculation. (You may suggest leaving out the indices and try to calculate > maximum-values-below-threshold directly, but the indices are useful to > address other fields in the data frame whence values came.) > > This problem can be simplified as following: > > in R, we have: > > a <- 1:10 > > a[c(1,3)] > [1] 1 3 > > a[c(0,3)] > [1] 3 > > While I was hoping to get: > > a <- 1:10 > > a[c(1,3)] > [1] 1 3 > > a[c(0,3)] > [1] 0 3 > > The straightforward solution, is to shift the whole test values one > position, so that the first value is always zero: > > > values <- c(0, 1.254, 1.648, 1.829, 1.874, 7.670, 7.673, 7.722) > > This solution, despite begetting a train of changes elsewhere in the code, > is semantically wrong, since the first element of values should be the first > value, now it is actually the 0-th value. > > What would you do in the case? ______________________________________________ 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.