[R] Check to see if a value is included within intervals
Bert Gunter
bgunter@4567 @end|ng |rom gm@||@com
Sat Jul 20 00:46:28 CEST 2019
If I understand correctly (make sure that I do!), ?findInterval should
essentially do what you want.
In your example (thanks!), I assume that:
1) The cutpoints defining your intervals are increasing, so p1 < p2 < p3
(p4 is unused)
2) You want to know which t2's are in the two intervals t2 <= p1 and p2 <
t2 <= p3.
If that is correct,
fi <- findInterval(t2, c(p1, p2, p3))
will give you a vector of 0's, 1's, 2's, and 3's. Indices with 0's are
those for which t2 <= p1. Indices with 2's are those for which p2 <t2 <=
p3. 1's are for indices with p1 <t2 <= p2 and 3's are for those t2's >
p3.
Function parameters can control whether intervals are open or closed on
left and/or right.
Cheers,
Bert
On Fri, Jul 19, 2019 at 3:11 PM Marine Regis <marine.regis using hotmail.fr>
wrote:
> Hello all,
>
> The R code below tests if values of the variable “t” are included or not
> within intervals that are defined from the data frame dat. The expected
> results are displayed using the function "rle" (see code below). Here is
> the code:
>
> ta <- 100
> tb <- 140
> tc <- 40
> td <- 85
>
> datF <- data.frame(t = 1:3650, e = NA)
> dat <- data.frame(a = seq(1, 3650, 365),
> b = seq(ta, 3650, 365),
> c = seq(ta + 1, 3650, 365),
> d = seq(ta + tb, 3650, 365),
> e = seq(ta + tb +1, 3650, 365),
> f = seq(ta + tb + tc, 3650, 365),
> g = seq(ta + tb + tc + 1, 3650, 365),
> h = seq(ta + tb + tc + td, 3650, 365))
>
> datF$e <- ifelse((datF$t %in% unlist(Map(`:`, dat$a, dat$b))), 1,
> ifelse((datF$t %in% unlist(Map(`:`, dat$e, dat$f))), -1,
> 0))
>
> ## Validation
> y <- rle(datF$e)
> y$lengths[y$values==1]
> y$lengths[y$values==0]
> y$lengths[y$values==-1]
>
>
> The code works but I would like to obtain the same results without using
> data frames and the function “Map”. Here is an example:
>
> a <- 100
> b <- 140
> c <- 40
> d <- 85
> y1 <- a + b + c + d
>
> t1 <- seq(1, y1*10, 1)
> t2 <- t1/y1 - floor(t1/y1)
> p1 <- a/y1
> p2 <- p1 + a/y1
> p3 <- p2 + b/y1
> p4 <- p3 + c/y1
>
> test <- 1*(t2 <= p1)- 1*(t2 > p2)*(t2 <= p3)
>
> ## Validation
> y <- rle(test)
> y$lengths[y$values==1]
> y$lengths[y$values==0]
> y$lengths[y$values==-1]
>
> Using this code, the results are not correct.
>
> Any help would be greatly appreciated.
> Many thanks
> Marine
>
>
>
>
>
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.
>
[[alternative HTML version deleted]]
More information about the R-help
mailing list