[R] how to get values within a threshold

Zhang Weiwu zhangweiwu at realss.com
Fri Sep 13 17:52:20 CEST 2013



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?



More information about the R-help mailing list